Zeilenweise und Zeichenweise einlesen



  • hi, hab mal ne frage wie sieht den der code aus, damit ich z.B. eine .txt liste zeilenweise einlese.
    und wie kann ich das ganze zeichenweise einlesn.

    danke im voraus



  • Zeilenweise:

    #include <fstream>
    #include <string>
    
    // ...
    
    std::ifstream in("datei.txt");
    while(in) {
      std::string zeile;
      std::getline(in, zeile);
    
      // Zeile verarbeiten
    }
    

    Zeichenweise:

    #include <fstream>
    
    // ...
    
    std::ifstream in("datei.txt");
    while(in) {
      char c = in.get();
    
      // Zeichen verarbeiten
    }
    


  • 0xdeadbeef schrieb:

    Zeilenweise:

    #include <fstream>
    #include <string>
    
    // ...
    
    std::ifstream in("datei.txt");
    while(in) {
      std::string zeile;
      std::getline(in, zeile);
    
      // Zeile verarbeiten
    }
    

    Zeichenweise:

    #include <fstream>
    
    // ...
    
    std::ifstream in("datei.txt");
    while(in) {
      char c = in.get();
    
      // Zeichen verarbeiten
    }
    

    Beide Versionen haben ein eof-Problem. So wie gepostet müsstest du jeweils nach dem Lesen und vor dem Verarbeiten noch auf fail bzw. wenigstens auf eof prüfen.
    Besser:

    #include <fstream>
    #include <string>
    
    // ...
    
    std::ifstream in("datei.txt");
    for (std::string zeile; std::getline(in, zeile);)
    {
         // zeile verarbeiten
    }
    

    und:

    std::ifstream in("datei.txt");
    for (char zeichen = 0; in.get(zeichen);)
    {
        // zeichen verarbeiten
    }
    


  • Hi HumeSikkins,

    deine Funktion funktioniert wunderbar aber kannst Du sie vielleicht einmal näher erläutern?

    #include <fstream>
    #include <string>
    
    // ...
    
    std::ifstream in("datei.txt");
    for (std::string zeile; std::getline(in, zeile);)
    {
         // zeile verarbeiten
    }
    

    Ich verstehe die for-Schleife hier überhaupt nicht. Woher weiß die Funktion welche Zeile grade eingelesen wird? Mich stört einfach, dass in der Schleife nichts sichtbar inkrementiert wird, wie ich es sonst gewohnt bin.

    Dank Dir!
    ravel



  • Hier muss ja auch nix inkrementiert werden. Im Bedingungsteil der for-schleife steht der getline-aufruf - und der liefert true oder false zurück, je nachdem ob das Lesen erfolgreich war. Solange also erfolgreich gelesen werden kann wird der Rumpf der for-schleife ausgeführt. Und sobald das Dateiende erreicht ist (oder irgendein Fehler auftritt) liefert getline false und die Schleife wird beendet.

    Wenn dir eine while-schleife besser gefällt - das ist genau das gleich:

    std::string zeile
    while (std::getline(in, zeile)) {
      // Zeile verarbeiten
    }
    

    Mfg, smasher1985


Log in to reply