ofstream: Datei nicht erzeugt, aber .good()=true



  • Ich versuche eine Datei zu erzeugen und Daten in diese Datei zu kopieren. Die Datei wird nicht erzeugt (Windows 7, keine Rechte für den Benutzer im Verzeichnis C:\). Das ist soweit klar und ok. Aber warum sagt das ofstream Objekt "alles ok"?

    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        ifstream ifile("lesbar.txt",ios::binary); // ok, öffnen klappt und Daten werden gelesen
        if(!ifile)
        {
            cerr << "ifstream open failed" << endl;
            return 1;
        }
    
        ofstream ofile("c:\\test.txt",ios::binary|ios::trunc); // Datei wird nicht erzeugt; keine Rechte für den Benutzer
        if(!ofile)
        {
            cerr << "ofstream open failed" << endl;
            return 1;
        }
    
        char c;
        while(ifile.get(c)&&ofile.good())
        ofile.put(c);
    
    // ofile.flush(); // dachte evtl. schreibt er erst jetzt und stellt fest, dass schreiben nicht möglich; ohne Effekt
    
        if(!ifile.eof())
        {
            cerr << "ifile.eof()" << endl;
            return 1;
        }
        if(!ofile.good())
        {
            cerr << "!ofile.good()" << endl;
            return 1;
        }
    
        return 0;
    }
    

    Edit: "c:\" -> "c:\" - hat aber nichts mit dem Problem zu tun (Dateinamen kommen über Kommandozeile)



  • Wie stellst du denn fest, dass alles gut ist?



  • statt "c:\autoexec.bat" solltest du "c:\\autoexec.bat" oder "c:/autoexec.bat" verwenden da das Zeichen '\' für escape sequenzen verwendet wird.



  • megaweber schrieb:

    statt "c:\autoexec.bat" solltest du "c:\\autoexec.bat" oder "c:/autoexec.bat" verwenden da das Zeichen '\' für escape sequenzen verwendet wird.

    Ja die \ hatte ich reineditiert. Die Namen kommen von der Kommandozeile.

    knivil schrieb:

    Wie stellst du denn fest, dass alles gut ist?

    Denke !ofile (Zeile 6), dass ofile.good() (Zeile 10) oder spätestens das !ofile.good() (Zeile 17) sollte doch einen Fehler bringen?



  • ihoernchen schrieb:

    Denke !ofile (Zeile 6), dass ofile.good() (Zeile 10) oder spätestens das !ofile.good() (Zeile 17) sollte doch einen Fehler bringen?

    Was meinst du mit Fehler? Wenn in Zeile 6+7 das return 1 ausgewertet wird, dann kommt er gar nicht mehr zu dem nachfolgenden Code. Auch weisst du nicht, welches der vielen if's fuer das retun 1 verantwortlich ist.



  • knivil schrieb:

    ihoernchen schrieb:

    Denke !ofile (Zeile 6), dass ofile.good() (Zeile 10) oder spätestens das !ofile.good() (Zeile 17) sollte doch einen Fehler bringen?

    Was meinst du mit Fehler? Wenn in Zeile 6+7 das return 1 ausgewertet wird, dann kommt er gar nicht mehr zu dem nachfolgenden Code. Auch weisst du nicht, welches der vielen if's fuer das retun 1 verantwortlich ist.

    Das Problem ist doch, es kommt nie zu einem return 1.
    Das ist ein vereinfachtes Beispiel, welches ich im Debugger steppe.

    Mich wundert doch, dass ofile.good() immer true ist.
    Ich gehe davon aus, kann er ofile nicht erzeugen oder nicht schreiben, ist ofile.good()==false. Nur das tritt nicht ein.



  • Gerade auf dem Mac probiert, bei Zeile 6 gibt !ofile false zurück (wie es eigentlich zu erwarten ist). Nur unter Windows 7 nicht. hmm



  • ihoernchen schrieb:

    Gerade auf dem Mac probiert, bei Zeile 6 gibt !ofile false zurück (wie es eigentlich zu erwarten ist). Nur unter Windows 7 nicht. hmm

    wenn du mir was compilerbares lieferst, probier ichs hier auch aus - aber so hab ich gerade keine lust : P



  • - bei ifile eine Datei zum Lesen eintragen.
    - bei ofile ein für den Benutzer nicht beschreibbares Verzeichnis bzw Datei z.B. c:\test.txt angeben (Windows 7).

    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	ifstream ifile("lesbar.txt",ios::binary); // ok, öffnen klappt und Daten werden gelesen
    	if(!ifile)
    	{
    		cerr << "ifstream open failed" << endl;
    		return 1;
    	}
    
    	ofstream ofile("c:\\test.txt",ios::binary|ios::trunc); // Datei wird nicht erzeugt; keine Rechte für den Benutzer
    	if(!ofile)
    	{
    		cerr << "ofstream open failed" << endl;
    		return 1;
    	}
    
    	char c;
    	while(ifile.get(c)&&ofile.good())
    	ofile.put(c);
    
    // ofile.flush(); // dachte evtl. schreibt er erst jetzt und stellt fest, dass schreiben nicht möglich; ohne Effekt
    
    	if(!ifile.eof())
    	{
    		cerr << "ifile.eof()" << endl;
    		return 1;
    	}
    	if(!ofile.good())
    	{
    		cerr << "!ofile.good()" << endl;
    		return 1;
    	}
    
    	return 0; 
    }
    


  • Also bei mir ist die Ausgabe (durch die eingeschränkten benutzerrechte wie erwartet) "ofstream open failed".
    (hab auch win7 und bin gerad mit nem account ohne adminrechte unterwegs.)

    bb


Anmelden zum Antworten