Filestream lesen und schreiben



  • Wusste ich's doch :D. C++ lernen und professionell anwenden von Ulla Kirch und Peter Prinz



  • @C-Sepp sagte in Filestream lesen und schreiben:

    Hier der korrigierte Code. Der Fehler ist trotzdem der Gleiche.
    ...

    Der Code lässt sich bei mir fehlerfrei übersetzen.



  • Lies sich damit auch ein Wert in eine Datei schreiben? Der Code ließ sich zuletzt auch bei mir fehlerfrei übersetzen, allerdings wurde nichts in die Datei geschrieben.



  • Sorry getline() war bei mir nicht verfügbar. Ist myfile.getline(...) bei dir da?



  • @C-Sepp
    ja, siehe auch:
    https://www.cplusplus.com/reference/fstream/fstream/

    und ja, es wird in test.txt geschrieben, bis ich einen '.' eingebe ...
    was heißt übrigens: fstream.getline() war nicht verfügbar? Dann dürfte sich das Programm ja gar nicht übersetzen lassen ... 😕



  • Gut....Den Teil hatte ich zum Übersetzen ausgeklammert. Kann es evtl. mit der Version zusammenhängen?...nutze die Community-Version von Microsoft Visual Studio 2019. Bisher hatte ich allerdings keine Probleme, dass irgendwelche
    Funktionen nicht verfügbar waren usw.



  • glaub ich nicht ... ich hab den Code unverändert, so wie er da oben hinter: korrigierte Version steht, mit Visual Studio Express 2015 übersetzt



  • Hmm...auch mit myfile.write(const char* str, streamsize count) ließ sich nichts reinschreiben.



  • Oder hängt es mit den Speicherort der erstellten Textdatei zusammen? Kann man den vielleicht irgendwie beeinflussen



  • Nein, ob der Code sich kompilieren lässt hängt nicht mit dem Speicherort der Datei zusammen.



  • @C-Sepp sagte in Filestream lesen und schreiben:

    Oder hängt es mit den Speicherort der erstellten Textdatei zusammen? Kann man den vielleicht irgendwie beeinflussen

    Natürlich kannst Du den beeinflussen ... aber wenn Du Deinen Code nicht kompilieren kannst, ändert das natürlich auch nix:

    char filename[] = "c:\\ein_ordner\\ein_unterordner\\test.txt";
    


  • Bitte nicht falsch verstehen...der Code ließ sich zuletzt kompilieren. Allerdings habe ich dazu myfile.getline(), welches bei mir nicht verfügbar ist, ausgeklammert



  • @C-Sepp sagte in Filestream lesen und schreiben:

    Bitte nicht falsch verstehen...der Code ließ sich zuletzt kompilieren. Allerdings habe ich dazu myfile.getline(), welches bei mir nicht verfügbar ist, ausgeklammert

    🤦♂
    Aha.
    Du lässt was weg, und dann funktioniert es nicht. Und das wundert dich jetzt? Ernsthaft?



  • Naja, hier passierte ja sowieso nix:

     while(myfile.getline(line, size))  //Fehler
     {        
     } 
    

    Trotzdem sollte das übersetzt werden können, wenn myfile den korrekten Typ hat ...



  • @hustbaer : So ist es nicht....ich habe als das getline() ausgeklammert, um zuerst das Schreiben von Daten in die Datei
    in Griff zu bekommen. Das funktioniert nicht, so wie man es denke ich herauslesen kann.



  • @C-Sepp Dann zeig doch nochmal 1 zu 1 den Code, der jetzt nicht funktioniert. Aus Prosa zu versuchen zu erraten, was du genau gemacht hast, ist mühselig.

    Hast du den Ideone Link von @SeppJ gesehen?



  • @C-Sepp Wenn du das getline ausgeklammert hast, dann ist line uninitialisiert. Wenn du sonst nix geändert hast, dann hat das Programm UB und du musst dich nicht wundern wenn es nicht funktioniert.

    Ansonsten: das was @Schlangenmensch gerade geschrieben hat.



  • @hustbaer: cin.getline(line, size) habe ich nicht ausgeklammert, ich habe nur myfile.getline() ausgeklammert aus
    bereits genannten Gründen

    Mein Quellcode:

    
    > #include <iostream>
    > #include <fstream>
    > using namespace std;
    > 
    > char filename[] = "test.txt";
    > 
    > int main()
    > {
    >     char line[100];
    >     const int size = sizeof(line);
    > 
    >     fstream myfile(filename, ios::out | ios::app);
    >     if (!myfile)
    >         cerr <<"Fehler beim Öffnen der Datei"<<endl;
    > 
    >     while (cin.getline(line, size))
    >     {
    >         if (line[0]=='.')
    >            break;
    >         if (!(myfile <<line <<endl)) //1. Option Daten in eine Datei zu schreiben
                   cerr <<"Fehler beim Schreiben der Datei"<<endl;
               if (!myfile.write((char*)&zeile, sizeof(zeile))) //2. Option Daten in eine Datei zu schreiben 
                    cerr << "Fehler beim Schreiben der Datei" << endl;
    
    >      }
    >      myfile.close();
    > 
    >      myfile.open(filename, ios::in);
    >      if (!myfile)
    >         cerr <<"Fehler beim Öffnen der Datei" <<endl;
    >      
    >      //while(myfile.getline(line, size))  //ausgeklammert da nicht verfügbar ("error C2039: "getline" ist kein Member von "std::basic_ofstream<char,std::char_traits<char>>".)
    >      //{        
    >      //} 
    > }
    >   
    >   ```
    > Komischerweise ließ sich mit der 1. Option bzw. 2. Option jetzt  was in die Datei schrieben.  Das waren 
    allerdings immer nur diese kryptische Zeichen, egal was ich eingegeben habe: (ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌø€÷
    ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌø€÷
    ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌø€÷
    ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌø€÷
    ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌø€)


  • Das ist nicht dein Quellcode. Wäre dies dein Quellcode, würdest du aufgrund der ">"-Zeichen und aufgrund der Variable "zeile" in Zeile 23 Fehler bekommen.

    Die Fehlermeldung weist auf einen ofstream hin. Sicher, dass du einen fstream hast? Warum überhaupt die Datei-Variable wiederverwenden? Nimm besser einmal einen ofstream zu Schreiben und einen ifstream zum Lesen. Dann brauchst du auch nicht die ios::-Konstanten (außer für append). Und das open geht dann gleich im Konstruktor.



  • @C-Sepp Ich habe das "zeile" durch line ersetzt und den auskommentierten Code einkommentiert.

    Kompiliert mit VS2019. Ich habe die Professional Version, aber vom Compiler sollte das keinen Unterschied machen.

    Deine 1. Option funktioniert sogar und schreibt die Eingabe in die Datei "test.txt". (Dafür habe ich die "Option 2" auskommentiert 😉 )

    Ich vermute du machst noch irgendwas anderes anders, was du vlt. gar nicht auf dem Schirm hast. Aber was, kann ich dir nicht sagen


Anmelden zum Antworten