Datei lesen und schreiben Code geht nicht :(



  • Könnte mir mal einer mein Fehler verraten ich hab mir hier was zusammengewurschtelt, einfach nur eine Datei schreiben und diese dann lesen lassen und den Text ausgeben. In Zeile 34 komt der Fehler:
    34 C:\Users\Johannes\Desktop\C++\Datei Schreiben\main.cpp no match for 'operator>>' in 'myFile >> var3'

    Mhh aber laut der Website hier müsste es gehen:
    http://www.cpp-tutor.de/cpp/le04/dateien.html

    Naja gut hier mal mein Code:

    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <windows.h>
    
    using namespace std;
    
    //
    int var3;
    //
    
    int main(int argc, char *argv[])
    {
    
        // Datei definieren & Verbinden
        ofstream myFile ("C:\\test.txt", ios::out|ios::binary);
        //Fehlerüberprüfung
        if(!myFile)
        {
                   MessageBox(NULL,"Keine Datei gefunden","Fehler!", MB_OK | MB_ICONERROR);
        }
        else
        {
    
            myFile << "1 ";
    
            //Dateiverbindung aufheben
            myFile.close();
            //erneut verbinden
            //myFile.open("C:\\test.dat");
        }
    
        myFile.open("C:\\test.txt", ios::in | ios::binary);
        myFile >> var3;
        cout << var3;
        myFile.close();
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • ofstream -> Ausgabe-Strom, ifstream -> Eingabe-Strom.

    Wenn du lesen willst, nimm letzteren. Ach ja, warum var3 global?



  • Okay jetz gehts, kann man eigentlich auch Texte untereinander schreiben in der Textdatei? endl; geht nämlich nicht

    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <windows.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    
        {
                 //Datei Definieren/schreiben
                 ofstream myFile("C:\\test.txt", ios::out | ios::binary);
    
                 //Fehlerprüfen
                 if(!myFile)
                 {
                           MessageBox(NULL,"Keine Datei gefunden","Fehler!", MB_OK | MB_ICONERROR);
                 }
                 else
                 {
                     myFile << "1";
                     myFile.close();
                 }    
        }
    
        {
                 //Variable
                 int var1;
                 //Datei lesen & ausgeben
                 ifstream myFile("C:\\test.txt", ios::in | ios::binary);
                 myFile >> var1;
                 cout << var1 << endl;
                 myFile.close();             
        }
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

  • Mod

    Waterfront_xD schrieb:

    Okay jetz gehts, kann man eigentlich auch Texte untereinander schreiben in der Textdatei? endl; geht nämlich nicht

    Klar, ginge endl. Du schreibst aber doch bloß eine Zeile, was erwartest du dann?
    Aber endl ist gerade im Zusammenhang mit Dateien falsch, wenn man nur einen Zeilenumbruch ('\n') möchte. endl entspricht Zeilenumbruch + flush. Einen flush möchtest du niemals ohne Grund durchführen, ganz besonders nicht bei Dateien. Da es eigentlich so gut wie nie Gründe für ein flush gibt, kannst du dir auch angewöhnen, immer '\n' zu nehmen, wenn du einen Zeilenumbruch willst, nie endl.



  • Gut also ich hab jetzt einfach hinter der 1 ein \n gemacht:
    Dann lasse ich mir die 3 Zahlen untereinander in der Console ausgeben.
    Wenn ich aber in die Datei gucke stehen die 3 Zahlen nebeneinander und nicht untereinander. Warum?

    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <windows.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    
        {
                 //Datei Definieren/schreiben
                 ofstream myFile("C:\\test.txt", ios::out | ios::binary);
    
                 //Fehlerprüfen
                 if(!myFile)
                 {
                           MessageBox(NULL,"Keine Datei gefunden","Fehler!", MB_OK | MB_ICONERROR);
                 }
                 else
                 {
                     myFile << "1\n " << "2\n " << "3\n ";
                     myFile.close();
                 }    
        }
    
        {
                 //Variable
                 int var1, var2, var3;
                 //Datei lesen & ausgeben
                 ifstream myFile("C:\\test.txt", ios::in | ios::binary);
                 myFile >> var1 >> var2 >> var3;
                 cout << var1 << endl << var2 << endl << var3;
                 myFile.close();             
        }
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • Weil du grundlos ios::binary als Flag fuer das erstellen des Filestreams verwendest. Weisst du eigentlich was das macht? Nein? Dann benutze es auch nicht auf gut Glueck.

    Zur Erklaerung: Ohne ios::binary koennen Dateistreams noch an den gelesenen und geschriebenen Daten etwas rumfummeln. In dem Fall beispielsweise den C++-Zeilen-Seperator \n auf Windows-Systemen in den dort gaengigen Zeilen-Seperator \r\n umwandeln oder halt umgekehrt beim lesen (auch wenn ein halbwegs vernuenftiger Editor auch mit blossem \n zurecht kaeme). ios::binary macht meistens nur dann Sinn, wenn du wirklich Binaerdaten schreiben und lesen willst willst. Dort waere es naemlich unpraktisch, wenn du ein 0x0A (\n) hast und der Stream dir ein 0x0D 0x0A (\r\n) draus macht.



  • Ahh cool danke 🙂 💡


Anmelden zum Antworten