Wie kann ich ganze Textdatei in einer Variabel einlesen?



  • Hallo,
    ich hoffe ich hab hier im richtigen Unterforum gepostet.
    Also meine Frage lautet wie folgt:

    Ich möchte mit ifstream das ich auf dat_ein lege einen ganzen Text in eine Variabel einlesen und nicht nur eine Zeichenfolge (bzw. ein Wort).

    Also mein Queltext sieht wie folgt aus:

    ...
    #include <ifstream>
    
    ...
    
    int main()
    {
    ifstream dat_ein;
    string text;
    ...
    
    dat_ein.open("text.txt");
    
    dat_ein >> text;
    
    dat_ein.close();
    .....
    

    ----------------------
    Text.txt

    Hallo Welt, wie gehts.

    ----------------------
    So, mit dem Queltext, den ich da habe liest C++ ja nur das erste Wort ein (Hallo). Ich möchte aber den ganzen Satz einlesen.

    Geht das Überhaupt, dass ich den ganzen Text in eine einzige Variabel bekomme?
    Wenn ja, welche Datentyp mus dan die Variabel sein und mit welchem Befehl?
    Ich hoffe, das ihr mir helfen könnt.



  • Es geht, auf verschiedene Arten. Die kürzeste ist diese:

    #include <fstream>
    #include <iterator>
    #include <string>
    #include <algorithm>
    
    // ...
    
    std::ifstream dat_ein ("text.txt");
    std::string text;
    std::copy (std::istream_iterator<char> (dat_ein), std::istream_iterator<char> (), std::back_inserter<std::string> (text));
    

    Das löscht aber alle Whitespaces.
    Du kannst das ganze auch natürlich über Schleifen machen:

    std::ifstream dat_ein ("text.txt");
    std::string text;
    std::string line;
    while (std::getline (in, line))
        text += line += '\n';
    


  • Rate mal was getline mit dem newline am Ende macht.

    So gehts:

    std::ifstream in("datei.txt");
    std::string text;
    std::copy (std::istreambuf_iterator<char> (in), std::istreambuf_iterator<char> (), std::back_inserter<std::string> (text));
    


  • So geht's auch

    ifstream dat_ein("text.txt");
      dat_ein >> noskipws;  // verhindert das Überlesen von Spaces usw.
      string text( istream_iterator< char >( dat_ein ), istream_iterator< char >() );
    

    und durch das noskipws schaltet man das Überlesen der Spaces, Tabs und Linefeeds ab.

    Gruß
    Werner



  • istreambuf_iterator ist schon besser. Jetzt kobiniert:

    std::ifstream dat_ein ("text.txt");
    std::string text(std::istreambuf_iterator<char> (in), std::istreambuf_iterator<char> ());
    

    Weil es so schön ist noch eine Variante:

    std::ifstream dat_ein ("text.txt");
    std::ostringstream s;
    s << dat_ein.rdbuf(); // operator<<(std::ostream&, std::streabuf*) kopiert den Stream, solange der noch was hergibt
    std::string text = s.str();
    


  • Ok, ich bedanke mich.
    Ich versuch mich da irgendwie durch zu wurschteln, weil ich von dem was ihr geschrieben hab nix kapiert hab 😃 Bin halt noch so unter Anfänger einzuordenen 😉
    Aber trotzdem danke.



  • Es gibt auch noch eine einfachere Methode,
    das Problem zu lösen:

    [cpp]#include<cstdlib>
    #include<iostream>
    #include<fstream>
    #include<string>
    
    using namespace std;
    
    int main() {
    
        string str;
    
        // Eingangsdatei definieren
        ifstream Quelle("test.txt");
    
        // Fehlermeldung anzeigen, falls auf die Datei nicht zugegriffen werden kann
        if(!Quelle) {
                     cerr << "Die Datei konnte nicht geoeffnet werden !";
                     system("Pause");
                     exit(-1);
        }
    
        // Datei auslesen und in einem string speichern
        else {
             char ch;
             while(Quelle.get(ch)) {
                                   str += ch;
                                   cout << ch;
             }
        }
    
        // Eingangsdatei schließen
        Quelle.close();
    
        // string ausgeben
        cout << "\n\nstring:\n\n" << str << endl << endl;
    
        cout << "\n\nEnde!" << endl << endl;
    
        system("Pause");
        return 0;
    }
    
    [/cpp]
    

    Dabei wird die Quelldatei ( in diesem Fall "test.txt" ) zeichenweise ausgelesen
    und jedes Zeichen auf dem Bildschirm ausgegeben.
    Alternativ werden alle Zeichen in einem string 'str' gespeichert, und dieser wird danach ausgegeben.
    Ich hoffe, dieser Code ist leichter nachzuvollziehen.

    Bobby - Karle



  • Sehr sehr vielen dank, die idee dahinter, hab ich verstanden und hinter den befehlen werde ich noch hinter kommen. aber ihr quellcode ist lange nicht so kompliziert, dafür dank ich ihnen 😉



  • Hallo,

    Manchmal ist auch ein Array von nützlich.

    MFG winexec*


Log in to reply