Problem mit ifstream.open()



  • Hier ein code Ausschnitt:

    if(GetOpenFileName(&file))
    			{
    				SetWindowText(hFileText, strFile);
    
    				ifstream ifs("file.txt");
    				if(!(ifs.is_open()))
    				MessageBox(hWnd,"fehler bei open()", "",0);
    

    ifs.is_open() ist in dem Fall immer false.
    Nur wenn ich das ifstream ifs("file.txt"); z.B. nach ganz oben verschiebe sodass es eine globale Variable ist, dann gibt is_open() true zurück.
    Kann das einer erklären?



  • Nur wenn ich das ifstream ifs("file.txt"); z.B. nach ganz oben verschiebe sodass es eine globale Variable ist, dann gibt is_open() true zurück.

    Ganz einfach: Irgendwas passiert zwischendurch, sodass die Datei nicht mehr zum Lesen geöffnet werden kann.



  • Das glaub ich dir einfach mal nicht. Videobeweis 😃



  • Vielleicht hast du das working directory gewechselt.



  • Hab den code jetzt so verändert dass es doch funktioniert, da waren andere Lesezugriffe aber keine auf diese Datei, egal es geht jetzt.
    Ich hätte das ganze einfach mit Win32 API und ReadFile gemacht, aber ich will die Datei komplett in ein vector Objekt einlesen und nicht in einen Buffer dessen Größe ich vorher selbst festlege.
    Ist diese Lösung in Ordnung?

    vecBuffer.clear();
    							while(ifs)
    								vecBuffer.push_back(ifs.get());
    							vecBuffer.at(vecBuffer.size()-1)=0;
    							ifs.close();
    							SetWindowText(hTextBox_01,vecBuffer.data());
    

  • Mod

    Warum setzt du den letzten Wert auf 0? Was, wenn der vector 0 Elemente hat? Ich habe eher den Eindruck, du möchtest in einen std::string einlesen.

    Dir ist schon klar, dass ifstreams sich automatisch schließen, wenn sie zerstört werden? RAII und so? Die Standardbibliothek kann das 😉 .



  • Ok hab ne Abfrage eingefügt ob der Vector 0 Elemente hat. Komischerweise ist der letzte Char der eingelesen wird immer ein nicht darstellbares Zeichen. Ich weis nicht wieso. Ich überschreib den mit 0 damit der String da beendet ist.
    An ein String Objekt hab ich hier gar nicht gedacht, würde wohl auch gut funtkionieren.
    Was meinst du mit automatisch schließen? Ich weis nicht was das bedeuten soll. Was hat das mit diesem Code zu tun?


  • Mod

    Francis123 schrieb:

    Ok hab ne Abfrage eingefügt ob der Vector 0 Elemente hat.

    Aber willst du denn tatsächlich das letzte Element überschreiben? 😮

    Komischerweise ist der letzte Char der eingelesen wird immer ein nicht darstellbares Zeichen. Ich weis nicht wieso.

    Ja, da habe ich einen typischen Anfängerfehler übersehen. Du prüfst, liest, verarbeitest. Wenn nun jedoch beim Lesen etwas schiefgeht (gets gibt dann eof zurück), dann verarbeitest du irgendwelchen Müll (hier also das eof-Zeichen)

    Ich überschreib den mit 0 damit der String da beendet ist.

    Bloß ist es ein vector, keine Zeichenkette im C-Stil. Nimm doch std::string für Zeichenketten. Der hat zur Not auch eine Funktion zur Umwandlung in eine Zeichenkette im C-Stil.

    Was meinst du mit automatisch schließen? Ich weis nicht was das bedeuten soll. Was hat das mit diesem Code zu tun?

    Na, das ifs.close(). Sieht man selten in C++. Eigentlich nur, wenn ifs später nochmal für eine andere Datei verwendet werden soll. Was keine gute Vorgehensweise wäre.

    Insgesamt willst du wohl:

    ifstream ifs("file.txt");
      string dateiinhalt(istreambuf_iterator<char>(ifs), istreambuf_iterator<char>());
      SetWindowText(hTextBox_01,dateiinhalt.c_str());
    


  • Wieso werden in der Textbox keine Zeilenumbrüche aus der Datei angezeigt?


  • Mod

    Francis123 schrieb:

    Wieso werden in der Textbox keine Zeilenumbrüche aus der Datei angezeigt?

    Versuch mal die Datei binary zu öffnen.



  • SeppJ schrieb:

    Insgesamt willst du wohl:

    ifstream ifs("file.txt");
      string dateiinhalt(istreambuf_iterator<char>(ifs), istreambuf_iterator<char>());
    

    Bei mir macht da most vexing parse ein Strich durch die Rechnung. :p


  • Mod

    out schrieb:

    Bei mir macht da most vexing parse ein Strich durch die Rechnung. :p

    Ich sollte meine Code testen. Es heißt nicht umsonst most vexing 🙂 . Man denke sich noch ein paar passende Klammern.


Anmelden zum Antworten