Datei zeilenweise auslesen?



  • Wenn ich mich hier so umsehe, fällt mir auf, dass ich immer mit Abstand die dümmsten bzw. elementarsten Fragen stelle. Das tut mir Leid - ich kriegs offenbar nicht gebacken. (Zu meiner Verteidigung: Ich habe gegoogelt, in meinem Buch geguckt und hier das Forum durchsucht. Offenbar bin ich nicht imstande, das damit auf die Reihe zu kriegen.)

    Hier mein jetziges Problem:
    Ich möchte zeilenweise aus einer Datei auslesen und jede Zeile in einem String speichern und diesen dann verwalten.

    Dazu habe ich (u.a.) versucht:

    void kartei::einlesen(std::string sourcefile)   {
        FILE *f = fopen( sourcefile.c_str(), "r" ) ;
        char buffer[50];  //habs auch mit std::string buffer versucht
        while( !feof( f ) )
        {
            fgets( buffer, sizeof( buffer ), f ) ;
            // hier den String verarbeiten
            std::cout << buffer << std::endl;
        }
    }
    

    Ich danke euch für eure Zeit.



  • Soweit ich mich rechtentsinne ist FILE *f = fopen C.

    Daher denke ich in C++ wäre das dann ifstream file; file.open(...); file.getline(...);

    Das Zeilenweise einlesen wird über getline() gemacht.
    Google mal nach fstream bzw. ifstream/ofstream da wirst einiges finden.

    Mfg. Matyr



  • und suche auch nach std::getline(..) (aus dem Header string).



  • Oh, danke euch 🙂
    ich schau gleich mal.



  • Okay, hab es jetzt damit probiert:

    void kartei::einlesen(std::string sourcefile)   {
        std::ifstream source;
        std::string buffer;
        source.open(sourcefile.c_str(), std::ios::binary|std::ios::in);
        std::getline(source,buffer,'\n');
        std::cout << buffer;
    }
    

    Wird zwar motzfrei kompliliert, erzeugt aber keine Ausgabe auf dem Bildschirm.
    Was habe ich falsch gemacht?
    Vielen Dank 🙂



  • Tonikum schrieb:

    Okay, hab es jetzt damit probiert:

    void kartei::einlesen(std::string sourcefile)   {
        std::ifstream source;
        std::string buffer;
        source.open(sourcefile.c_str(), std::ios::binary|std::ios::in);
        std::getline(source,buffer,'\n');
        std::cout << buffer;
    }
    

    Wird zwar motzfrei kompliliert, erzeugt aber keine Ausgabe auf dem Bildschirm.
    Was habe ich falsch gemacht?
    Vielen Dank 🙂

    Binary gelesen.

    void kartei::einlesen(std::string sourcefile)   
    {
        std::ifstream source;
        std::string buffer;
        source.open(sourcefile.c_str(), std::ios::in);
        std::getline(source,buffer);
        std::cout << buffer << std::endl;
    }
    

    Um jede Zeile zu verwalten würde ich das noch etwas verbessern:

    void kartei::einlesen(std::string sourcefile)   
    {
        std::ifstream source;
        std::vector< std::string > page;
    
        if ( source.is_open() )
        {
           std::string buffer;
           source.open(sourcefile.c_str(), std::ios::in);
           std::getline(source,buffer);
           std::cout << buffer << std::endl;
           page.push_back(buffer);
        }
    }
    

    Dann haste alle Zeilen in einem Vector und jedes Element von Vector ist eine Zeile.
    rya.



  • Hallo Scorcher!
    Vielen Dank!

    Leider wird bei mir immer noch nichts auf dem Bildschirm ausgegeben. Die txt-Datei befindet sich im gleichen ORdner wie das Projekt.

    😞

    Die zweite Idee finde ich toll, leider führt sie zu mir zu einem Programmabsturz.



  • Ja weil ich dumm bin.. blöde kopiererei 😛

    void kartei::einlesen(const std::string& sourcefile)   {
        std::ifstream source(sourcefile.c_str());
        std::vector< std::string > page;
    
        if ( source.is_open() )
        {
           std::string buffer;
           while ( !source.eof() ) 
           {
            std::getline(source,buffer);
            std::cout << buffer << std::endl;
            page.push_back(buffer);
           }
        } 
    }
    

    Natürlich fehlt das while...
    rya.



  • Tonikum schrieb:

    Wenn ich mich hier so umsehe, fällt mir auf, dass ich immer mit Abstand die dümmsten bzw. elementarsten Fragen stelle. Das tut mir Leid - ich kriegs offenbar nicht gebacken.

    Hallo Tonikum,

    nicht verzagen - einfach weiter probieren. Programmieren lernt man nur mit der Praxis.

    Tonikum schrieb:

    (Zu meiner Verteidigung: Ich habe gegoogelt, in meinem Buch geguckt und hier das Forum durchsucht. Offenbar bin ich nicht imstande, das damit auf die Reihe zu kriegen.)

    Hier mein jetziges Problem:
    Ich möchte zeilenweise aus einer Datei auslesen und jede Zeile in einem String speichern und diesen dann verwalten.

    Also wenn Du in diesem Forum nur nach 'zeilenweise' gesucht hättest, wäre einer der ersten Treffer dies hier gewesen.

    Tonikum schrieb:

    Dazu habe ich (u.a.) versucht:

    void kartei::einlesen(std::string sourcefile)   {
        FILE *f = fopen( sourcefile.c_str(), "r" ) ;
        char buffer[50];  //habs auch mit std::string buffer versucht
        while( !feof( f ) )
        {
            fgets( buffer, sizeof( buffer ), f ) ;
            // hier den String verarbeiten
            std::cout << buffer << std::endl;
        }
    }
    

    Wenn Du das mit 'fopen' aus Deinem Buch hast und vorne auf dem Buch steht was von 'C++', so werfe das Buch bitte sofort weg!

    Erzähle doch bitte noch, was bei

    // hier den String verarbeiten
    

    passieren soll. Welche Infos brauchst Du aus der Datei - womöglich die Kunden aus diesem Thread?

    .. schau da noch mal vorbei.

    Gruß
    Werner



  • Tonikum schrieb:

    Okay, hab es jetzt damit probiert:

    void kartei::einlesen(std::string sourcefile)   {
        std::ifstream source;
        std::string buffer;
        source.open(sourcefile.c_str(), std::ios::binary|std::ios::in);
        std::getline(source,buffer,'\n');
        std::cout << buffer;
    }
    

    Wird zwar motzfrei kompliliert, erzeugt aber keine Ausgabe auf dem Bildschirm.
    Was habe ich falsch gemacht?

    .. meistens liegt das daran, dass die Datei nicht da liegt, wo das Programm sie sucht; also immer prüfen, ob die Datei auch offen ist. Scorcher24 hat Dir ja schon gezeigt, dass das binary zuviel ist, und das Öffnen direkt im Konstruktor von ifstream geschehen kann. Ich sage Dir jetzt noch, dass das mit getline ein Holzweg ist. Mal unterstellt Du möchtest Kunden einlesen

    void kartei::einlesen( const std::string& sourcefile)   {
        std::ifstream source( sourcefile.c_str() );
        if( !source.is_open() )
        {
            std::cerr << "Fehler beim Oeffnen von " << source << std::endl;
            return;
        }
        // --   und so liest man ein, wenn Du einen Streaming-Operator für kunde hast
        for( kunde k; source >> k; ) // lese bis Fehler oder EOF (End Of File)
            einfuegen( new kunde( k ) );
        if( !source.eof() ) // falls alles Ok war, so wäre jetzt EOF gesetzt!
            std::cerr << "Fehler beim Einlesen aus " << source << std::endl;
    }
    

    .. und falls Du was anderes einlesen möchtest, so musst Du kunde nur gegen den gewünschten Typ tauschen und natürlich den passenden Streaming-Operator implementieren.

    Gruß
    Werner



  • Hallo Werner, danke für die Anwort!
    Werde mich morgen gleich mal drüber machen.

    Das mit dem fopen hatte ich nicht aus dem Buch sondern ergoogelt. Hab wohl übersehen, dass es nur für C ist.

    Ich hatte nach "Datei zeielnweise auslesen" gesucht, vlt hab ich diesen Thread übersehen. Sorry!

    Ja genau, es bezieht sich auf meinen Thread von vorher.
    Ich möchte in der Datei zeilenweise die Daten der Form "Name, Beruf, Alter" lagern und einlesen können.

    Wie lerne ich denn am besten Programmieren? Ich habe dieses dicke Buch vom Breymann, Google und dieses Forum. ICh kenne leider keinen besonders gut, der programmieren kann - aber so merke ich irgendwie keine großen Fortschritte...
    😞



  • Tonikum schrieb:

    Ich hatte nach "Datei zeielnweise auslesen" gesucht, vlt hab ich diesen Thread übersehen.

    Suche doch mal nur nach istream und gebe mich (Werner Salomon) in der Suche als Autor an; ich habe relativ viele Beiträge zum Thema 'Einlesen'.

    Tonikum schrieb:

    Wie lerne ich denn am besten Programmieren? Ich habe dieses dicke Buch vom Breymann, Google und dieses Forum.

    na ja - Buch durcharbeiten und möglichst viel selbst programmieren - insbesondere die Übungen im Buch. Der Fortschritt kommt mit der Praxis .. das dauert länger als ein paar Wochen 😉
    Und Fragen möglichst konkret hier im Forum stellen.

    Gruß
    Werner


Anmelden zum Antworten