fstream problem



  • Hallo erstmal 😃 zuerst einmal ich bin ein totaler neu eunsteiger in c++ und weiß das einige mich für mein code töten würden sry leute arbeite noch an den vielen fehlern 😉
    so nun zu mein problem : wie man sieht geht es hier drum information aus 4 dateien zu lesen und in eine neue datei abzuspeichern klappt alles sehr gut aber dann habe ich eine der text dateien mit einer markdown datei ausgetauscht wie man sieht und von der markdown datei speichert er nur die letzte zeile in die csv ab bei allen anderen den kompletten inhalt ?
    in zeilen 24-32 ist die md-datei die ich meine

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    //für die nummerierung der in den später csv ausgegebenen werten 
    int var1 = 1 , var2 = 2 , var3 = 3 , var4 = 4 , ;
    
    int main ()
    {
        // 4 verschiedene  dateien deren inhalt  zusammen in eine csv gebracht werden sollen 
        fstream fin( "C:/Ruby193/1.txt" );
      string buffer;
      string tmp_array[200];
      int i=0;
      while (fin.good()) {
        getline(fin,buffer);
        tmp_array[i]=buffer;
        i++;
    }
    
       fstream fin2( "C:/Ruby193/m.md" );
      string buffer2;
    
      int a=0;
      while (fin2.good()) {
        getline(fin2,buffer2);
        tmp_array[a]=buffer2;
        a++;
    }
    
       fstream fin3( "C:/Ruby193/3.txt" );
      string buffer3;
    
      int e=0;
      while (fin3.good()) {
        getline(fin3,buffer3);
        tmp_array[e]=buffer3;
        e++;
    }
    
       fstream fin4( "C:/Ruby193/4.txt" );
      string buffer4;
    
      int v=0;
      while (fin4.good()) {
        getline(fin4,buffer4);
        tmp_array[v]=buffer4;
        v++;
    }
    
       //csv erstellen 
       ofstream myFile;
       myFile.open ("C:/Ruby193/hallo.csv");
       // Wenn keine fehler
       if (myFile)
       {
          // Daten schreiben
          myFile << var1 << buffer << endl;
          myFile << var2 << buffer2 << endl;
          myFile << var3 << buffer3 << endl;
          myFile << var4 << buffer4 << endl;
    
          // Dateien schliessen / ich weiß nicht ob dies überhaupt noch notwendig ist ? :)
          myFile.close();
          fin.close ();
          fin2.close ();
          fin3.close ();
          fin4.close ();
       }   
    }
    


  • du hast noch nicht mal die gröbsten schnitzer aus deinem programm entfernt ( while(stream.bad()) ) etc.

    eigtl müsstest du nur in dem alten thread gucken und würdest sehen, dass da so einiges nicht sinnvoll ist... : S



  • unskilled schrieb:

    du hast noch nicht mal die gröbsten schnitzer aus deinem programm entfernt ( while(stream.bad()) ) etc.

    eigtl müsstest du nur in dem alten thread gucken und würdest sehen, dass da so einiges nicht sinnvoll ist... : S

    wie gesagt ich habe ja schon gesagt ich arbeite dran ..:) ist jetzt alles föllig unnötig aber mein programm läuft wie es soll ... ausser wenn ich stat der txt datei eine markdown datei verwende ein tipp währe sehr hilfreich



  • versuch es doch mal ganz einfach zu erklären, was dein programm machen soll... ich mag nich noch mal alles durchlesen, um das wichtige herauszubekommen : P



  • Achso okii 🙂 Also ich habe ein ordner mit 2 unterordner in jedem dieser unter ordner sind markdown dateien drinne ... und in jeder markdown datei steht ein xbiliebiger text unt in eckigen klammern [bestimmte werte ]

    mein programm soll aus allen markdown dateien die werte lesen , summieren und in eine exel datei (.csv) speichern

    aber ich fange ertmal damit an den kompletten text von mehreren datein in eine exel datei zu speichern was bei txt dateien gut klappt aber bei markdown nicht richtig 🙂



  • also im prinzip nichts weiter, als eine filesystem-lib (boost o.ä.) und dann die dateien öffnen, nach '[' suchen, dann eine zahl einlesen und diese zu den bisherigen zahlen addieren?!

    dann die summe nehmen und in eine neue datei schreiben.

    wo hängts?

    dein quellcode ist ein wenig eigenartig.
    hast du die pfade komplett gegeben?(so siehts ja aus) dann kannst du dir die filesystem-lib sparen...



  • unskilled schrieb:

    also im prinzip nichts weiter, als eine filesystem-lib (boost o.ä.) und dann die dateien öffnen, nach '[' suchen, dann eine zahl einlesen und diese zu den bisherigen zahlen addieren?!

    dann die summe nehmen und in eine neue datei schreiben.

    wo hängts?

    dein quellcode ist ein wenig eigenartig.
    hast du die pfade komplett gegeben?(so siehts ja aus) dann kannst du dir die filesystem-lib sparen...

    .. ja genau so ungefähr meine ich es ... ja ich weiß mein code ist eigenartig ich bin ein totaler anfänger und hab versucht irgendwas in der richtung stück für stück zusammen zu bassteln ... wenn jemand also ein paar nützliche links hat um dies zu verwirklichen währe ich sehr dankbar 🙂



  • Musstest du noch einen 2. Beitrag aufmachen?

    Cevin19994 schrieb:

    .. ja genau so ungefähr meine ich es ...

    Was denn nun, genau oder ungefähr?

    Suche erst mal nach dem CSV- Dateiformat. Da sollten schon hunderte von Beiträgen dazu im Netz zu finden sein.

    Kein Wunder, wenn du nix findest - ächsel.csv soll das doch sein, oder 😕 🤡

    Was soll denn in der ?.csv drin stehen?

    2012-04-05 08:45 |hours_worked=10;2012-04-05 09:45 |hours_worked=1;2012-04-05 018:45 |hours_worked=1,5
    

    😕

    Du solltest dir erst mal selbst klar werden wie die Ausgangsdateien aussehen und wie du die Daten dann in der ?.csv stehen haben möchtest.


  • Mod

    Was soll dieser Thread? Wenn du die Antworten aus dem ersten Thread
    http://www.c-plusplus.net/forum/308807
    komplett ignorierst und dann einfach anfängst noch einmal mit genau dem gleichen Code und einer noch ungenaueren Problembeschreibung zu fragen, warum sollte man dir überhaupt helfen wollen? Anscheinend willst du gar nichts selber machen, sondern wartest nur auf die Komplettlösung zu einem Problem, das du gar nicht einmal richtig beschreiben kannst.



  • f.-th. schrieb:

    Musstest du noch einen 2. Beitrag aufmachen?

    Cevin19994 schrieb:

    .. ja genau so ungefähr meine ich es ...

    Was denn nun, genau oder ungefähr?

    Suche erst mal nach dem CSV- Dateiformat. Da sollten schon hunderte von Beiträgen dazu im Netz zu finden sein.

    Kein Wunder, wenn du nix findest - ächsel.csv soll das doch sein, oder 😕 🤡

    Was soll denn in der ?.csv drin stehen?

    2012-04-05 08:45 |hours_worked=10;2012-04-05 09:45 |hours_worked=1;2012-04-05 018:45 |hours_worked=1,5
    

    😕

    Du solltest dir erst mal selbst klar werden wie die Ausgangsdateien aussehen und wie du die Daten dann in der ?.csv stehen haben möchtest.

    ich bin mir in klaren wie es aussehen soll
    in der csv soll eine tabelle angelegt werden als überschriften soll stehen date,files create,hours worked...
    und darunter sortiert die daten anzahl an erstellten dateien und arbeitszeiten (auf summiert )

    Datum dateien erstellt arbeitszeit
    23.2.2012 2 5
    24.2.2012 4 7

    so soll es aussehen ich habe 2 dateien für jedes datum also insgesamt 4 dateien
    2 dateien für den 23.2.2012 und 2 für den 24.2.2012 .. in meiner beispiel tabelle sind die werte aus den 4 dateien summiert und sortiert ... mein programm soll das machen können



  • SeppJ schrieb:

    Was soll dieser Thread? Wenn du die Antworten aus dem ersten Thread
    http://www.c-plusplus.net/forum/308807
    komplett ignorierst und dann einfach anfängst noch einmal mit genau dem gleichen Code und einer noch ungenaueren Problembeschreibung zu fragen, warum sollte man dir überhaupt helfen wollen? Anscheinend willst du gar nichts selber machen, sondern wartest nur auf die Komplettlösung zu einem Problem, das du gar nicht einmal richtig beschreiben kannst.

    und nein !! sry wenn mich niemand versteht ... ich habe schon oben erwähnt das ich aus dem alten thread die antwort berücksichtige ... aber das ist ja nicht mein eigendliches problem ... und ich will keine lösung sondern tipps wo und nach was ich suchen soll um meine aufgabe zu lösen ... 😕 andschein formuliere ich mich nicht richtig und verständlich



  • Cevin19994 schrieb:

    ich habe schon oben erwähnt das ich aus dem alten thread die antwort berücksichtige ...

    glaubt dir nur keiner, dass du sie berücksichtigst. weil du 0 geändert hast.

    Cevin19994 schrieb:

    aber das ist ja nicht mein eigendliches problem ...

    dein eigentliches Problem ist, dass du nicht mal deine Aufgabenstellung genau schildern kannst.

    Cevin19994 schrieb:

    und ich will keine lösung sondern tipps wo und nach was ich suchen soll um meine aufgabe zu lösen ... 😕 andschein formuliere ich mich nicht richtig und verständlich

    du hast doch den genauen ablauf... wenn du wissen willst, wie man eine datei öffnet: google: "cpp datei öffnen", wenn du wissen willst, wie man eine datei ausliest: "cpp datei auslesen". wenn du wissen willst, wie man in C++ addiert: "cpp zahlen addieren". muster erkennbar? : P

    bb



  • Cevin19994 schrieb:

    aber das ist ja nicht mein eigendliches problem ...

    dein eigentliches Problem ist, dass du nicht mal deine Aufgabenstellung genau schildern kannst. [/quote]

    Also ich finde ich habe es verständlich erklärt 🙂

    Cevin19994 schrieb:

    und ich will keine lösung sondern tipps wo und nach was ich suchen soll um meine aufgabe zu lösen ... 😕 andschein formuliere ich mich nicht richtig und verständlich

    du hast doch den genauen ablauf... wenn du wissen willst, wie man eine datei öffnet: google: "cpp datei öffnen", wenn du wissen willst, wie man eine datei ausliest: "cpp datei auslesen". wenn du wissen willst, wie man in C++ addiert: "cpp zahlen addieren". muster erkennbar? : P

    bb[/quote]

    ja klar ist erkennbar 🙂 ich google mir seit 3 tagen von morgens bis abends die finger wund ... die einzelnen aufgaben also öffnen lesen schreiben addieren filtern und so weiter .. die kann ich ja einzelnd ergoogeln aber ich weiß nicht wie ich alles zusammen benutzen soll also jaa wie die ganzen funktionen mit einander funktionieren ... da ist mein problem ? Hilfe ? 🙂



  • sry wegen den falschen zitaten 😮



  • Ok Ich möchte jetzt gerne meine frage umstellen 🙂
    ich möchte wissen wie man text inhalt von dateien liest nach bestimmten werten filtert , summiert und das ergebins in eine neue datei gespeichert wird ?
    Also ich weiß das ich die einzelnen funktion googlen kann aber nicht wie ich alles zusammen benutze ? wie kann man das hin kriegen ..



  • Cevin19994 schrieb:

    Ok Ich möchte jetzt gerne meine frage umstellen 🙂
    ich möchte wissen wie man text inhalt von dateien liest nach bestimmten werten filtert , summiert und das ergebins in eine neue datei gespeichert wird ?
    Also ich weiß das ich die einzelnen funktion googlen kann aber nicht wie ich alles zusammen benutze ? wie kann man das hin kriegen ..

    Also. Dazu musst du dir folgende Fragen beantworten:
    1. Welchen Aufbau hat meine Datei genau.
    2. Welche Daten interessieren mich aus dieser Datei.
    3. Welchen Datentyp haben die Daten, die mich interessieren.

    Hast du diese Fragen beantwortet, geht es ans eingemachte.
    1. Meistens definiert man sich eine Klasse, die Daten logisch zusammenfasst. Bei dir war es ja glaub, Stunden, Datum und noch irgendwas.
    2. Du definierst dir einen operator>> der eine Instanz deiner Klasse mit Leben füllt.
    3. In einer for-Schleife liest du dann die Datei ein. In jedem neuen Schleifendurchgang gibt es ja eine neue Instanz deiner Klasse, die du in einem std::vector abspeicherst.

    Nun hast du deine Datei im vector stehen. Dann würde es jetzt mit der Auswertung der gelesenen Daten weitergehen. Aber versuch erstmal, es bis hierher zu schaffen.



  • @Out

    Danke 🙂

    Genau diese Art von hilfe hab ich gesucht 🙂

    ich werde die fragen beantworten und die punkte abarbeiten dann melde ich mich wieder 🙂
    achja was meinst du mit punk 3 (datentyp) ? also es ist ein ganz einfacher text oder was meinst du ?



  • Cevin19994 schrieb:

    achja was meinst du mit punk 3 (datentyp) ? also es ist ein ganz einfacher text oder was meinst du ?

    Naja, wenn in deiner Datei eine Kommazahl steht, soll sie höchst wahrscheinlich als double interpretiert werden. Wenn da eine Ganzzahl stellt, soll es wohl ein int sein.... Du willst ja was rechnen.



  • out schrieb:

    Cevin19994 schrieb:

    achja was meinst du mit punk 3 (datentyp) ? also es ist ein ganz einfacher text oder was meinst du ?

    Naja, wenn in deiner Datei eine Kommazahl steht, soll sie höchst wahrscheinlich als double interpretiert werden. Wenn da eine Ganzzahl stellt, soll es wohl ein int sein.... Du willst ja was rechnen.

    unterschiedlich 🙂 in den dateien werden datum zeit(in stunden ) und an erstellten dateien wiedergegeben das sind manchmal ganze zahlen manchmal dezimalzahlen ...



  • Cevin19994 schrieb:

    Ok Ich möchte jetzt gerne meine frage umstellen 🙂
    ich möchte wissen wie man text inhalt von dateien liest nach bestimmten werten filtert , summiert und das ergebins in eine neue datei gespeichert wird ?
    Also ich weiß das ich die einzelnen funktion googlen kann aber nicht wie ich alles zusammen benutze ? wie kann man das hin kriegen ..

    Definiere Dir zunächst eine Struktur oder Klasse, die genau einen Datensatz von dem aufnehmen kann, was Dich interessiert. Soweit ich dass Deinen bisherigen Beiträgen entnehmen kann sind das das Datum und die Werte hours_worked und filescreated . Letztere sollen auch addiert werden. Also müsste die Struktur vielleicht so aussehen:

    #include <string>
    
    struct MD
    {
        std::string datum; // der Einfachheit halter als String definiert
        double hours_worked;
        double filescreated;
    };
    

    Zweiter Schritt ist die Implementierung einer Funktion, die genau einen solchen Datensatz liest. Ich unterstelle mal, dass die Datei so aussieht, wie Du sie hier beschrieben hast.
    Dann wäre das so zu machen:

    #include <istream>
    #include <fstream>
    #include <limits> // numeric_limits
    #include <string>
    
    // struct Md (s.o.)
    
    namespace
    {
        const std::streamsize ALL = std::numeric_limits< std::streamsize >::max();
    };
    
    std::istream& operator>>( std::istream& in, MD& md )
    {
        in.ignore( ALL, '[' ) >> md.datum;
        std::string token;
        if( getline( in.ignore( ALL, '|' ), token, '=' ) )
        {
            md.hours_worked = 0.; // initialisieren, da nicht immer alle Member gelesen werden!
            md.filescreated = 0.;
            if( token == "hours_worked" )
                in >> md.hours_worked;
            else if( token == "filescreated" )
                in >> md.filescreated;
            else
                in.setstate( std::ios_base::failbit ); // Formatfehler!
        }
        return in;
    }
    

    Die Signatur in Zeile 13 nennt man einen Extraktor oder Streaming-Operator zum Einlesen. Das ermöglicht Dir später, ein Objekt der Struktur MD genau so wie z.B. einen int zu lesen. Beispiel:

    MD md;
        if( cin >> md ) {
            // Objekt md richtig gelesen.
    

    In Zeile 15 wird mit dem ignore( ALL, '[' ) alles bis zum '[' überlesen und die folgenden Zeichen bis zum Leerzeichen sind dann wohl das Datum. Dann wird nochmal alles überlesen bis zum '|' (Zeile 17) und dann mit getline der String bis zum '=' gelesen, um heraus zu bekommen, ob es sich um hours_worked oder filescreated handelt.

    Der Rest ist dann einfach

    //Vorspann s.o.
    
    int main()
    {
        using namespace std;
        ifstream fin("C:/Ruby193/1.txt");
        fin.imbue( locale( "german" ) );
        if( !fin.is_open() )
        {
            cerr << "Fehler beim Oeffnen der Datei" << endl;
            return -2;
        }
        for( MD md; fin >> md; )
        {
            // hier md auswerten
            ; // .. addieren
        }
        if( fin.eof() )
        {
            cout << "alles gelesen" << endl;
        }
        return 0;
    }
    

    Ganz wichtig ist noch, dass Du in Zeile 7 dem Stream mitteilst, dass die Fließkommazahlen in deutscher Schreibweise also mit ',' als Dezimaltrenner - gelesen werden sollen.

    Damit wäre das Einlesen schon erledigt. Zum addieren könntest Du Dir einen Operator bauen, der zwei MD-structs einfach addiert. Wie das geht ist im Cpp-Magazin beschrieben.

    Gruß
    Werner


Log in to reply