ifstream.fail()==1 Und nun?
-
Bei meinem Problem habe ich den Code bis zur Trivialität verkürzt, aber selbst jetzt komme ich nicht weiter. In der Config.ini steht nur "mM54".
is.bad() und is.eof() melden Fehlerfreiheit; ich nutze MS Visual C++ 6.0.#include <iostream> #include <fstream> using namespace std; int main() { int i=0; ifstream is; is.open ("config.ini"); if (is.fail()) cout<<"\nFail:\tFehler im Strom"; cout<<"\n"; cout<<"\n"; return 0; }
Die Ausgabe sieht dann so aus:
Fail: Fehler im Strom Press any key to continue
-
Offenbar hast du das Problem zu weit gekürzt. Soweit ich das sehe, gibt es nur zwei Gründe für das Scheitern:
- die Datei konnte nicht geöffnet werden (das kannst du mit isopen() abfragen)
- ein Leseversuch (den du freundlicherweise übergangen hast) konnte mit dem Dateiinhalt nichts anfangen
(Anmerkung: fail() meldet "normale" Fehler (falsches Datenformat, ungültige Werte etc), bad() meldet Katastrophen (der Stream ist physisch unbrauchbar))
-
int main() { int i=0; ifstream is; is.open ("config.ini"); if ( !is ) { cout<<"Fehler "; exit(1); } //<-testen ob datei geöffnet werden konnte if (is.fail()) cout<<"\nFail:\tFehler im Strom"; cout<<"\n"; cout<<"\n"; return 0; }
-
Vielen Dank für eure Hinweise. Durch das untere Beispiel schließe ich, dass is.open ("config.ini") fehlschlägt. Aber woran kann das liegen? Wenn ich config.txt statt config.ini verwende, komme ich zum gleichen Ergebnis.
#include <iostream> #include <fstream> using namespace std; int main() { ifstream is; is.open ("config.ini"); if (is.is_open()) /////Fail1 cout<<"\nFail:\tKein Fehler1 im Strom"; else cout<<"\nFail:\tFehler1 im Strom"; if (!is) /////Fail2 cout<<"\nFail:\tFehler2 im Strom"; if (is.fail()) /////Fail3 cout<<"\nFail:\tFehler3 im Strom"; cout<<"\n"; cout<<"\n"; return 0; }
Fail: Fehler1 im Strom Fail: Fehler2 im Strom Fail: Fehler3 im Strom Press any key to continue
-
Die Datei config.ini kann offenbar nicht geöffnet werden - schuld daran ist wohl, dass sie nicht gefunden werden kann. Liegt sie auch brav im angegebenen Verzeichnis (in diesem Fall also im ausführenden Verzeichnis)?
MfG SideWinder
-
Die config.txt liegt im Debug-Ordner, wo sich auch die EXE befindet. Sollte eigentlich klappen.
Aber jetzt kommt's: Wenn ich den Pfad und den Names statt nur den Namen angebe läuft es! (ifstream.good==1) Zum einen bin ich froh, dass das Einlesen klappt, andererseits soll das Programm nicht nur in meinem Debug-Verzeichnis laufen. Was mache ich falsch?MfG
Kemfar
-
kemfar schrieb:
Die config.txt liegt im Debug-Ordner, wo sich auch die EXE befindet. Sollte eigentlich klappen.
Nicht immer ist das Arbeitsverzeichnis auch das, wo deine EXE liegt (beim MSVC kenne ich es so, daß das Projektverzeichnis als Arbeitsverzeichnis gewählt wird)
-
Vielen Dank für die sehr schnellen und sehr guten Antworten!
Wenn ich eine Release-Version erstelle, brauche ich nicht den kompletten Pfad anzugeben.
Beste Grüße
Kemfar
-
naja, unter projekteigenschaft -> Debuggen -> Anwednungsverzeichnis ist standardmäßi das übergeordnete verzeichnis der anwendung angegeben:
c:\cpp\Projekte\testProjekt\proj.vcproj c:\cpp\Projekte\testProjekt\Debug\debug.exe c:\cpp\Projekte\testProjekt\Release\release.exe
→ c:\cpp\Projekte\testProjekt ist das "./" Verzeichnis...