fstream geht mal, geht mal nicht



  • Abend

    Ich hoffe eure Kristallkugeln sind frisch poliert, ich habe hier nämlich wieder mal ein Mysterium zu lösen. Ich hab nämlich ein Problem mit dem fstream und zwar funktioniert es bei einigen Files wunderbar, bei anderen stürzt er nach ein paar Zeilen ab.

    #include <fstream>
    #include <vector>
    #include <string>
    #include <sstream>
    
    struct asw
    {
       std::vector <std::string> Inhalt;
       int laenge;  
    } KAT,ERG;
    
    load()
    {
       char zeile[1024];
    
       f.open("C:\test1.txt", ifstream::in);
    
       if(f.good)
       {
          g.open("C:\test2.txt", ifstream::in);
          if(g.good())
          {
             f.seekg(0L, ios::beg);
    
             while (! f.eof())
             {
                 f.getline(zeile, 1024);
                 KAT.Inhalt.push_back(zeile);
                 KAT.laenge++;
             }
    
             g.seekg(0L, ios::beg);
    
             while (! g.eof())
             {
                 g.getline(zeile, 1024);
                 ERG.Inhalt.push_back(zeile);
                 ERG.laenge++;
             }
    
             f.close();
             g.close();
          }
       }
    }
    

    Das Script ist grob rauskopiert, ich weiss nich ob es so funktioniert, aber generell lauft es bei mir...

    Lustigerweise geht beim auskommentieren des ersten Auslesens alles wunderbar, er kann also die "g-files" immer lesen. Die Files enthalten nur ASCII Zeichen und die Zeilen sind auch nie länger als 1024 Zeichen, deshalb vermute/hoffe ich dass es nicht an den Files liegt. Beim Debuggen zeigt er immer bei der gleichen gelesenen Zeile noch den letzten Inhalt der variable "zeile" an, obwohl diese sich eigentlich schon hätte ändern müssen. wenn er dann die variable in "KAT.Inhalt" speichern will stürzt er ab...

    Wenn ihr mir sonst einfach eine bewährte Alternative bieten könnt, währe ich schon sehr dankbar. Ich muss einfach Zeile für Zeile heraus lesen und in eine Variable abspeichern.



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Mathiable schrieb:

    Das Script ist grob rauskopiert, ich weiss nich ob es so funktioniert, aber generell lauft es bei mir...

    Na, du bist gut. Das was du hier schreibst steckt so voller Fehler, dass kann man niemals kompilieren. Ich habe mir mal die Freiheit genommen alles zu korrigieren und an ein paar Stellen zu verbessern. Wahrscheinlich verschwindet dadurch auch dein Fehler. Bei dem was du hier abgeliefert hast kann man nicht nachvollziehen wo er überhaupt liegt.

    #include <fstream>
    #include <vector>
    #include <string>
    // #include <sstream> // Wird hier nirgends benutzt
    
    std::vector <std::string> KAT,ERG;  // Es gibt schließlich vector::size. Das macht das Speichern der Länge überflüssig
    // Globale variablen sind eigentlich kein guter Stil
    
    void load()  // Funktionen müssen einen Rückgabewert haben
    {
       std::string zeile;   // std::string kennst du ja anscheinend, warum sich mit char-Arrays rumärgern?
    
       std::ifstream f,g;    // Waren bei dir anscheinend auch global, ich definier sie jetzt in der Funktion, damit das Programm überhaupt kompiliert
    
       f.open("C:\test1.txt", std::ios::in);   // Die Openmodes liegen standardmäßig im Namespace std::ios, nicht in ifstream
    
       if(f.good()) //good()  ist eine Funktion, keine Membervariable
       {
          g.open("C:\test2.txt", std::ios::in);
          if(g.good())
          {
             // f.seekg(0L, ios::beg);  // Das Lesen beginnt sowieso am Anfang
    
             while (getline(f,zeile)) KAT.push_back(zeile); // Beschäftige dich mal damit, wann ein stream EOF wird. Dann dürfte dir ein Fehler an deiner alten Schleife auffallen
    
             // g.seekg(0L, ios::beg); // siehe oben
    
             while (getline(g, zeile)) ERG.push_back(zeile);  // getline ist eine Funktion aus dem string-Header, die für std::string funktioniert. Macht ansonsten das gleiche wie die gleichnamige istream Memberfunktion
    
             f.close();
             g.close();
          }
       }
    }
    


  • Zu meiner verteidigung: das meiste hab ich aus diesem board heraus kopiert 😉

    std::ifstream f,g;    // Waren bei dir anscheinend auch global, ich definier sie jetzt in der Funktion, damit das Programm überhaupt kompiliert
    

    Sorry die hab ich noch vergessen zu erwähnen. Sind bei mir drin und natürlich nicht global. Global ist nur was in mehreren Unterprogrammen verwendet wird und den struct den ich gemacht habe ist die allgemeine Schnittstelle...

    while (getline(f,zeile)) KAT.push_back(zeile); // Beschäftige dich mal damit, wann ein stream EOF wird. Dann dürfte dir ein Fehler an deiner alten Schleife auffallen
    

    So funktioniert bei mir gleich gar nichts mehr. lässt sich kompilieren, macht aber gar nichts. und dass mit dem EOF hat bisher immer gut funktioniert, er stürzt ja nicht wegen der while Schlaufe ab, sondern weil er irgendwas mit dem fstream nicht richtig macht

    while (! g.eof())
                  {
                      getline(g, zeile);  //<-hier liest er nichts mer raus
                      ERG.push_back(zeile); //<- hier stürtzt er ab...
                      ERG.laenge++;
                  }
    

    Funktioniert auf jeden fall immer noch nicht wirklich. Habe alles abgeändert, aber macht immer noch dieselben Fehler

    Edit: Ok das mit der while Schleife geht doch ganz gut, hat nur ein Fehler mit dem Format gegeben. Problem besteht aber immernoch 😞



  • Ok Mysterium gelöst, hat gar nur indirekt etwas mit diesem Script zu tun...
    Sorry für die Zeitverschwendung...



  • Mathiable schrieb:

    Ok Mysterium gelöst, hat gar nur indirekt etwas mit diesem Script zu tun...
    Sorry für die Zeitverschwendung...

    es ist kein script ><
    wer bringt denn bitte anfängern bei, c++-quelltext script zu nennen? 😡



  • Mathiable schrieb:

    Global ist nur was in mehreren Unterprogrammen verwendet wird und den struct den ich gemacht habe ist die allgemeine Schnittstelle...

    Dennoch ist dies nicht der schöne Stil. Wozu gibt es bitte schön Übergabeparameter bei Funktionen? Zumal man dann auch an dem Funktionskopf sieht was die Funktion tatsächlich benötigt.


Anmelden zum Antworten