fstream schlägt bei zweiten open fehl



  • Ich hatte mir auf die Schnelle ein Script zusammengebastelt, welches einige Wörter aus einer Datei ausliest, in einen vector speichert und dann in eine andere Datei zurückschreibt.

    Anstatt ifstream und ofstream hab ich nur fstream verwendet.
    mit fstream Objekt Datei öffnen, dann lesen und dann schließen. Das öffnen der neuen Datei schlägt fehl, obwohl diese angelegt wurde.

    Ist das ein normales Verhalten bei fstream. Im Code springt er in den fail-Bereich. 😃 Das ist mir gänzlich neu. (verwende gcc (GCC) 3.4.5)

    #include <fstream>
    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
    	fstream fileStream;
    	vector<string> vStrings;
    	string tmp;
    
    	fileStream.open("test.ini", ios::in);
    
    	while(!fileStream.eof())
    	{
    		getline(fileStream, tmp);
    		vStrings.push_back(tmp);
    	}
    
    	fileStream.close();
    
    	fileStream.open("foo.ini", ios::out|ios::app);
    
    	if(fileStream.fail())
    	{
    		cerr << "???" << endl;
    		return -1;
    	}
    
    	for(unsigned int i=0; i<vStrings.size(); ++i)
    		fileStream << vStrings[i] << endl;
    
    	fileStream.close();
    
        return 0;
    }
    


  • Ganz einfach:

    #include <fstream>
    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
        fstream fileStream;
        vector<string> vStrings;
        string tmp;
    
        fileStream.open("test.ini", ios::in);
    
        while(!fileStream.eof())
        {
            getline(fileStream, tmp);
            vStrings.push_back(tmp);
        }
    
        fileStream.close();
        fileStream.clear(); // Hier das clear einfügen um Status auf OK zu setzten
    
        fileStream.open("foo.ini", ios::out|ios::app);
    
        if(fileStream.fail())
        {
            cerr << "???" << endl;
            return -1;
        }
    
        for(unsigned int i=0; i<vStrings.size(); ++i)
            fileStream << vStrings[i] << endl;
    
        fileStream.close();
    
        return 0;
    }
    

    Du musst nach dem schließen, clear ausführen, damit die Statusflags zurückgesetzt werden( EOF wurde ja gesetzt) , der Status des Objektes wird also wieder auf OK gesetzt.
    Lässt du das clear weg, schlägt deßhalb das erneute Öffnen fehl.

    Hoffe konnte dir helfen!

    Gruß freeG



  • genial 🙂 danke ... da hät ich ewig suchen können.



  • Kein Problem 🙂

    Und gilt natürlich auf für ofstream und ifstream, also wenn du zum Beispiel ein ifstream Objekt hast und es mehrmals für verschiedene Dateien verwendest, dann immer nach dem close() ein clear() benutzen. 😉

    ifstream in( "test.txt", ios::in );
    
    // lese was aus test.txt
    
    in.close();
    in.clear(); // ganz wichtig auch hier immer ein clear() benutzen um den Status auf 
                // OK zu setzten.
    
    in.open( "test2.txt" );
    
    // lese was aus test2.txt
    
    in.close();
    

    Gruß freeG


Anmelden zum Antworten