fstream problem



  • 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



  • Werner ? Danke schön das hilft mir 100 % weiter 🙂
    und vielen dank das du alles so großzügig beschrieben hast 🙂
    so ist der lern effeckt grüßer 🙂



  • Hmmm Werner ? ich habe jetzt ein problem
    nachdem mir im forum nicht ganz geholfen wird ausser @out er hat mich auf den richtigen weg gebracht habe ich mein alten code weggeschmissen und neu angefangen ... da ist dann fast das gleiche wie bei dir rausgekommen nur mit viel mehr fehlern 😃
    dank dir konnte ich jetzt meine fehler ausbügeln ... danke 🙂
    dann hab ich alles noch mam ausgeführt und bekam diesen fehler : cerr und cout damit hat er ein problem
    das konnte ich abr mit dem includen von iostream lösen 😛
    jetzt wenn ich alles ausführe spuckt mir die console aus das die anwendung ungewöhnlich beendet wird dann reagiert sie nicht mehr und windows erzwingt das schließen diese prozes

    was tun ? kann es sein das es daran liegt weil ich die md noch nicht auswerten lasse ? glaube ich nicht gruß cevin 🙂



  • Na komm, jetzt sei Mal nicht undankbar. Die Leute haben immerhin Mühe und Zeit investiert, auch wenn der Ton und die Antworten vielleicht nicht immer so waren, wie Du es Dir gewünscht hättest. Aber jeder hat eben auch seine Auffassung, was dem Lernenden weiterhilft, und viele haben da eben auch eine, die nicht Deinen Vorstellung entspricht, obwohl sie gut gemeint war.

    Zu Deinem Problem: Der Code sollte nicht sonderlich komplex sein, oder? Du könntest ihn posten.

    Besser: Debugge doch Mal durch (d.h. setz Haltepunkte, der Debugger hält das Programm dann bei der Ausführung automatisch an und Du kannst von dort aus schrittweise vorgehen), um festzustellen, in welcher Zeile er genau "ungewöhnlich beendet wird". Vielleicht findest Du den Fehler dann auch selbst.



  • Ich bin ja nicht undankbar und ich versteh auch das jeder seine andere art hat hilfe anzubieten 🙂



  • Cevin19994 schrieb:

    das konnte ich abr mit dem includen von iostream lösen 😛
    jetzt wenn ich alles ausführe spuckt mir die console aus das die anwendung ungewöhnlich beendet wird dann reagiert sie nicht mehr und windows erzwingt das schließen diese prozes.

    Zeig mal deinen kompletten Code, der kompilierbar ist, und der den Fehler reproduziert.



  • #include <iostream>
    #include <istream> 
    #include <fstream> 
    #include <limits>  
    #include <string>
    
    struct MD 
    { 
        std::string datum; 
        double hours_worked; 
        double filescreated; 
    };
    
    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.;  
            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 ); 
        } 
        return in; 
    }
    
    int main() 
    { 
        using namespace std; 
        ifstream fin("C:/Ruby193/m.md"); 
        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; 
    }
    

    das ist das was werner mir gezeigt hat 🙂



  • Die einzige Möglichkeit, wo eine Exception geworfen werden kann, ist in Zeile 42. Dein System kennt wahrscheinlich die Locale("german") nicht.
    Auf welcher Umgebung arbeitest Du (Betriebssystem, Compiler)?

    Um sicher zu gehen: kopieren die Zeile 42 hinter Zeile 47 und füge vorher und nachher noch eine Ausgabe ein - etwa:

    int main()
    {
        using namespace std;
        ifstream fin("C:/Ruby193/m.md");
        if( !fin.is_open() )
        {
            cerr << "Fehler beim Oeffnen der Datei" << endl;
            return -2;
        }
        cout << "Datei ist offen" << endl;
        fin.imbue( locale( "german" ) );
        cout << "locale 'german'" << endl;
        for( MD md; fin >> md; )
           // usw.
    

    .. und probier' es nochmal.

    Wenn ich richtig informiert bin, müsste es unter Linux

    fin.imbue( locale( "de_DE" ) );
    

    heißen


Anmelden zum Antworten