Filestream lesen und schreiben



  • Hallo Leute,

    ich möchte ein kleines C++-Programm schreiben, welches mehrere Textzeilen von der Tastatur einliest und
    in eine Datei "test.txt" schreibt. Der Anwender soll seine Angabe mit einem Punkt in einer neuen Zeile beenden.
    Die Datei soll zum Lesen jeder Textzeile anschließend auch wieder geöffnet werden. Dazu habe ich folgenden Code:

    #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; //Fehler Siehe unten 
               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))  //Fehler
         {
            ...
         }
      
    
    }
    
    

    Beim Versuch die eingegeben Zeilen mit myfile <<line usw.v in die Datei zu schreiben erscheinen immer die Fehler:
    error C2297: "<<": Ungültig, da der rechte Operand vom Typ "char [100]" ist
    error C2563: Listen der formalen Parameter stimmen nicht überein
    error C2568: "<<": Auflösung der Funktionsüberladung nicht möglich
    Was muss ich ändern, auch mit myfile <<123 usw. hat es nicht funktioniert. Komisch find ich auch, dass die getline
    Methode zum Einlesen der Zeilen für myfile bei mir nicht verfügbar ist. Vielen Dank für eure Hilfe!



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

        if (!(myfile <<line <<endl; //Fehler Siehe unten 
           cerr "Fehler beim Schreiben der Datei" <<endl;
    

    Naja, hier sind ja schon offensichtliche Fehler:

    • die Klammer vom if wird nicht geschlossen (du hast 2 öffnende Klammern, aber keine schließende Klammer)
    • da sollte kein Semikolon in der if-Zeile sein
    • hinter dem cerr fehlen die <<

    Und noch was anderes: warum char[100] statt std::string?

    if (line[0]=='.')

    Das hier vergleicht nur, ob das erste Zeichen ein Punkt ist. Ich würde ja den gesamten String vergleichen. Solange du line als char-Array hast, müsstest du strcmp verwenden. Aber wir sind ja hier bei C++ und nicht bei C, also verwende std::string für deine line-Variable und vergleiche dann mittels if (line == ".") { ... }.



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

    
    > #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)) //Fehler Siehe unten 
    >            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))  //Fehler
    >      {        
    >      } 
    > }
    >   
    > 
    
      ...

  • Mod

    Auch wenn, oder gerade weil, du es einem echt schwer machst, dir zu helfen (was sollen die ganzen '>'?): Fehler nicht nachvollziehbar: https://ideone.com/hgxfCE



  • Mit << und >> lassen sich eigentlich Daten formatiert in Dateien schreiben bzw. lesen. Ich habe es gerade nochmal mit einem string ausprobiert:

    string zeilen;
    ...
    if (!myfile << zeilen)
    ....

    Jetzt mit der Fehlermeldung:
    error C2677: Binärer Operator "<<": Es konnte kein globaler Operator gefunden werden, der den Typ "std::string" akzeptiert (oder keine geeignete Konvertierung möglich)


  • Mod

    Auch wenn, oder gerade weil, du es einem echt schwer machst, dir zu helfen: Fehler nicht nachvollziehbar

    Brachst du Hilfe?



  • Das sind alle Information die ich zu den Problem habe...



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

    if (!myfile << zeilen)

    Schau dir mal an, wie stark die Operatoren binden. Was ist "nicht stream"? Richtig, ein bool. Dann bool << string? Geht nicht.

    Klammern fehlen, du willst das ! auf den Ausdruck (a<<b) anwenden, nicht << auf den Ausdruck !a.



  • Habe es gerade mal mit einer boolschen Variable ausprobiert, die akzeptiert wurde. Auch hier hat das Schrieben
    in die Datei nicht funktioniert...die Datei ist leer. Komisch dass in den Buch woraus ich lerne, der <<-Operator
    immer mit einem Char Array verwendet wird.



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

    Komisch dass in den Buch woraus ich lerne,

    Magst du mal verraten, welches Buch und von wem (Autor) das ist?



  • 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.


Anmelden zum Antworten