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:

    1. die Datei konnte nicht geöffnet werden (das kannst du mit isopen() abfragen)
    2. 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...


Anmelden zum Antworten