fstream - ich mach was falsch?



  • Hi,

    ich kapiers net:

    std::fstream FStream;
    
    		FStream.open ("test.txt", std::ios::in|std::ios::binary);
    
    		// 1. Dateigröße bestimmen. 
    		FStream.seekg(0, std::ios::end); 
    		unsigned long FileSize = std::streamoff(FStream.tellg()); 
    		FStream.seekg(0, std::ios::beg); 
    
    		// 2. Puffer anlegen und _ganze_ Datei einlesen und schließen. 
    		char* Buffer = new char[FileSize]; 
    		FStream.read(Buffer, FileSize); 
    
    		FStream.close ();
    
    		// 3. Text ausgeben.
    		std::cout << Buffer;
    
    		// 4. Temp Buffer löschen
    		if (Buffer != NULL)
    		{
    			delete [] Buffer;
    			Buffer = NULL;
    		}
    

    Er tut die test.txt richtig einlesen und co. doch bei der Ausgabe schreibt er erst den Orginal text und dann gibt er so viele ""§$%&/()*'Ä+#" Aus wie der Text lang ist?!?!

    Wieso gibt der so viele Müllzeichen nach dem eigentlichen Text aus?!?!!?



  • Du öffnest die Datei doch binär, warum?



  • weil sie binär abgespeichert wurde und würde ich es weglassen -> selber effekt



  • Der Buffer ist nicht 0-terminiert.



  • und wie mache ich das?!?!

    bzw. kann man die datei auch in einen String reinlesen? ich habs so versucht:

    FStream.read (myString.c_str(), FileSize);

    doch das ging irgendwie net gut



  • 0-terminiert bedeutet, dass das letzte Zeichen im Buffer eine 0 sein muss.



  • Und zwar nicht '0' sondern '\0' = static_cast<char>(0)



  • Hi,

    okay ich hab nun an der letzten Pos im Array \0 eingefügt

    Buffer[FileSize] = '\0';

    und es funzt, doch wie mach ich das denn nun mit dem String objekt?



  • Nimm einen std::vector<char> vec, dann hast du garantiert zusammenhängenden Speicher. Ein std::string kann auch anders implementiert sein. Wenn du die Daten eingelesen hast, kannst du mit std::string str(vec.begin(), vec.end()) den Inhalt des Vektors in den String kopieren, dabei wird er auch gleich nullteminiert.
    Buffer kann übrigens an der Stelle nie NULL sein. (Und wenn es NULL wäre, wäre der Code vorher schon abgestürzt...)



  • recht umständlich um ein einfaches char array in einen string reinzustopfen, meinst du nicht? Ich mein, dafür extra einen vector benutzen? müsste doch auch einfacher gehen, oda?



  • Hier nochmal zwei Varianten. Welche besser ist, würde mich auch mal interessieren.

    ifstream file(...);
    string x;
    
    copy(istreambuf_iterator<char>(file),
         istreambuf_iterator<char>(),
         back_insert_iterator<string>(x));
    
    //oder
    
    stringstream temp;
    temp << file.rdbuf();
    x = tmp.str();
    


  • DrGreenthumb schrieb:

    ifstream file(...);
    string x;
    
    copy(istreambuf_iterator<char>(file),
         istreambuf_iterator<char>(),
         back_insert_iterator<string>(x));
    

    Das sieht zumindest nicht sehr performant aus, wenn der String jedes Mal vergrößert wird...

    Und naja, ein vector ist immerhin weniger Code und sicherer als new[]/delete[]. Das Design von basic_string ist aber auch nicht so mein großes Vorbild 😉



  • Also folgender Vorschlag:

    ifstream OpenFile("/home/stefan/code/temp/test.txt");
                    string ergebnis;
                    char ch;
                    while(!OpenFile.eof())
                    {
                            OpenFile.get(ch);
                            ergebnis.push_back(ch);
                    }
    

    Bei mir hat das wunderbar funktioniert

    Stefan


Anmelden zum Antworten