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 1ausgewertet wird, dann kommt er gar nicht mehr zu dem nachfolgenden Code. Auch weisst du nicht, welches der vielen if's fuer dasretun 1verantwortlich 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 1ausgewertet wird, dann kommt er gar nicht mehr zu dem nachfolgenden Code. Auch weisst du nicht, welches der vielen if's fuer dasretun 1verantwortlich 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