Zeile aus Datei lesen?



  • Guten Tag,

    ich sitze jetzt schon seit geraumer Zeit
    an einem Code, welcher eine Zeile aus einer TXT-Datei
    auslesen soll.

    Aber ich bekomme es einfach nicht hin.

    Ich habe eine Datei namen.txt:

    Erwin
    Gustav
    Johannes
    Lars
    Igor
    Stefan
    Thomas
    ...
    

    Ich habe es schon hinbekommen, dass er alles bis zu einer
    bestimmten Zeile ausliest.

    Aber ich möchte ja nur die eine bestimmte Zeile auslesen
    und nicht alle.

    Hier mein Code:

    ifstream read("namen.txt");
        ofstream write("ausgabe.txt");
        string a;
    
        srand(time(NULL));
    	int gen = (rand() % 10) + 1;
    
        for(int i = 1; i <= gen; i++)
        {
            getline (read, a);
            write << a << endl;
        }
    
        write.close();
        read.close();
    

    Es soll nur diese eine Zeile (und nicht alle bis dieser) in die Datei
    ausgabe.txt geschrieben werden.

    Könnte mir vllt. jemand helfen?

    greetz

    Doug



  • for(int i = 1; i <= gen; i++) // Stattdessen besser: for(int i = 1; i < gen; ++i)
    {
        getline (read, a); // ignore them
    }
    
    getline(read, a); // the important line
    write << a << endl;
    

    MfG SideWinder



  • Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Guten Tag,

    vielen danke 😉

    Funktioniert erstklassig.

    Könntest du den Code vllt. ein wenig
    erläutern?

    greetz

    Doug



  • Es liest zuerst mit Hilfe einer for-Schleife alle Zeilen bis zur gen-ten Zeile aus und ignoriert sie. Jetzt steht der Dateizeiger an der richtigen Position und der nächste getline()-Aufruf liest nun die gewünschte Zeile aus.

    MfG SideWinder



  • hmm fast SideWinder 😉 du gehst mit deinem "besser" eine Zeile zu wenig durch ...

    #include <string>
    #include <fstream>
    #include <cstdlib>
    #include <ctime>
    
    // Beim Programmstart folgendes aufrufen:
    std::srand(std::time(NULL)); // EDIT: Hatte eine Klammer vergessen!
    
    bool read_write_rand_line(const std::string& file_in, const std::string& file_out)
    {
        std::fstream file_stream(file_in.c_str(), std::ios::in);
        if (!file_stream)
            return false;
    
        std::size_t rand_line = ++(std::rand() % 10);
        std::string line_in;
        for (std::size_t scip_line = 0; scip_line <= rand_line; ++scip_line)
            std::getline(file_stream, line_in); // der letzte Aufruf ist für uns entscheidend ... dann steht der String drin :)
    
        file_stream.close();
    
        file_stream.open(file_out.c_str(), std::ios::out);
        if (!file_stream)
            return false;
    
        file_stream << line_in << std::endl;
        file_stream.close();
        return true;
    }
    

    ... so in etwa ... musst nur gucken das die Zeilen auch da sind ...

    Edit
    Zu spät ... aber das ist ne vollständige Lösung 😉



  • Glaube ich ehrlich gesagt nicht, ich lese aus Schönheitsgründen nach der for-Schleife nochmal extra mit mit getline() ein und verwende nicht den letzten Aufruf der for-Schleife als Ergebnis.

    BTW: Beim Veranschaulichen kick doch die ganzen Namespaces, die verwirren den Benutzer doch nur.

    MfG SideWinder



  • In den Bedingungen eurer for-Schleifen solltet ihr lieber den Stream noch auf Gültigkeit prüfen. ( eof )

    Wir wollen ja nicht das was böses passiert 😉


Anmelden zum Antworten