Wiederöffnen einer Datei mit ifstream



  • Hallo liebe Gemeinde,

    ich habe bereits in mehreren Foren (deutsch/englisch) Antworten auf mein Problem gefunden, die helfen sollten, es dennoch aber nicht tun.

    Ich möchte gerne in einer Schleife eine Datei mit ifstream mehrfach öffnen, auslesen und wieder schliessen. Der erste Durchlauf durch die Schleife geht reibungsfrei, beim zweiten Öffnen bringt tellg() grundsätzlich nur noch den Wert -1 statt der aktuellen Pointerposition für getline(), trotz der Empfehlungen aus anderen Foren clear() oder auch seekg() zu verwenden.

    Ich benutze den commandline-Compiler bcc32 von Borland, Version 5.5.1.
    Kann mir jemand helfen ?

    Danke und Gruß, Olaf.

    ifstream fus_datei;
    
    ... // u.a. wird dateiname definiert
    
    for (int cnt_schicht = 0; cnt_schicht < anz_schichten; cnt_schicht++)
    {
       fus_datei.open(dateiname);
       fus_datei.clear();
    
       while (1 != 0)
       {
          ... // u.a. Definition von strstr_string
    
          fus_datei.getline(fus_zeile, 100, '\n');
    
          if (strstr(fus_zeile, strstr_string) != NULL)
          {
             cout << ".";
    
             break;   // Schleife wird vor EOF verlassen.
          }
       }
    
       fus_datei.seekg(0, ios_base::end);
       fus_datei.close();
    

  • Administrator

    1. Bitte cpp Tags verwenden.
    2. Wieso verwendest du nicht std::string in Verwendung mit der freien Funktion std::getline ?
    http://www.cplusplus.com/reference/string/string/
    http://www.cplusplus.com/reference/string/getline/
    Das aber nur als Hinweis oder Frage aus Neugier.
    3. Zu deinem Problem, probier mal das hier aus:

    // ifstream fus_datei; <- weg damit
    
    ... // u.a. wird dateiname definiert
    
    for (int cnt_schicht = 0; cnt_schicht < anz_schichten; cnt_schicht++)
    {
       // das:
       ifstream fus_datei(dateiname);
       // anstatt:
       // fus_datei.open(dateiname);
    
       // ganz sicher nicht mehr nötig:
       // fus_datei.clear();
    
       while (1 != 0)
       {
          ... // u.a. Definition von strstr_string
    
          fus_datei.getline(fus_zeile, 100, '\n');
    
          if (strstr(fus_zeile, strstr_string) != NULL)
          {
             cout << ".";
    
             break;   // Schleife wird vor EOF verlassen.
          }
       }
    
       // Beides auch unnötig:
       // fus_datei.seekg(0, ios_base::end);
       // fus_datei.close();
    

    Grüssli



  • Hallo,

    Danke für Deine Antwort.

    Deinen Code-Vorschlag hatte ich in meiner allerersten Version, der hat leider auch nicht funktioniert.

    Danke, Olaf.


  • Administrator

    Hast du das tellg gleich nach dem erstellen des Inputstreams gesetzt? Also in deinem Code:

    ifstream fus_datei(dateiname); // Und gleich danach:
    std::cout << fus_datei.tellg() << std::enl;
    

    Und das liefert dir dann -1 ? Veränderst du in der Schleife etwas an dateiname ?

    Grüssli


Anmelden zum Antworten