[C++] Fstream Problem

  • Ersteller Ersteller NeoXpert
  • Erstellt am Erstellt am
N

NeoXpert

Gast
Moin,

kleines Problem mit den lieben Fstreams. Und zwar möchte ich in einer schleife mehrere dateien öffnen.. das geht aber nicht ; ). Das erste File wird korrekt geöffnet - die folgenden interessieren nicht... man sollte meinen mit

fstream file;
char puffer[5];

for (int i = 0 ; i < 5; i++)
{
file.open(Namei, ios::open);
file.read(puffer,5);
file.close();
cout << puffer;
}

müsste so in etwa funktionieren - aber nööö. Da das nicht wollte habe ich mir gedacht "machst es nochmal einfach mit zweimal hintereinander öffnen":

#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
fstream file;
char hallo[5];

file.open ( "test2.txt" , ios::in );
file.read(hallo,5);
file.close();

cout << hallo;

file.open ( "test.txt" , ios::in );
file.read(hallo,5);
file.close();


cout << hallo;

system("PAUSE");
return EXIT_SUCCESS;
}

das geht auch nicht.. man bekommt nur den inhalt der ersten datei, wenn man mit .good() prüft erhält man bei der zweiten öffnung schon kein true mehr :(. Kennt jemand dieses "Problem" oder weiß jemand was ich falsch machen?

lg Neo
 
das problem besteht wohl bei verschiedenen implementierungen der c++-libs. könntest also mal genauer in die implementierung von fstream schauen.

aber mach es doch nach dem raii pattern und erstell in jedem schleifendurchlauf ein neues fstream objekt. das erstellen des objektes ist nicht so aufwendig und kann im verhältnis zu dem aufruf von open() vernachlässigt werden. (ich schreib das mal mit ifstream, da du ja scheinbar nur lesen willst.)
Code:
 char puffer[5];
 for (int i = 0 ; i < 5; i++)
 {
   ifstream file(Name[i]);
   if (file)
   {
     file.read(puffer,5);
    cout << puffer;
   }
 }
das close wird implizit im destructor aufgerufen.
du solltest auch immer schauen, ob es mit dem öffnen der datei geklappt hat. du kannst es auch über exception-handling machen so wegen weniger code schreiben und so.
 
Code:
fstream file;
char puffer[5];

for (int i = 0 ; i < 5; i++)
{
  file.open(Namei, ios::open);
  file.read(puffer,5);
  file.close();
  [b][i]file.clear();[/i][/b]
  
  cout << puffer;
}

Das sollte dich zum Erfolg führen. Wenn eines der Zustandsbits gesetzt wird - sprich EOF, Fail, Bad, so ist jede Operation auf dem Stream ein NoOp - sprich nix passiert. Mit einem Aufruf von clear setzt du die Fehlerbits zurück.

Die Lösung von ghorst, RAII zu verwenden, ist natürlich noch besser.

Noch ein vielleicht wichtiges Problem: Du liest mit read. Das ist unformatierter Input. D.h. an das Ende des Arrays wird keine terminierende Null geschrieben. D.h. was bei der Ausgabe mit cout rauskommt kann vielleicht sinnvoll sein, vielleicht Müll, vielleicht auch das Programm völlig abstürzen lassen.
 
Danke euch : ) Ich habs gerade erstmal mit dem clear() gemacht - schon gings.. irgendwie hat mir das visual studio clear() nicht angeboten?!? sonst wär ich vielleicht selbst drauf gestoßen beim suchen - danke euch.

Jo das mit dem abschließendem Zeichen weiß ich, aber die beiden Codes oben hab ich in 5 Minuten hingeklatscht zum Testen, weil ich ungern in meinem DVB-Parser rumspielen wollte ; ).

Ich denke ich werde das mal noch in die von ghorst vorgeschlagene Form umbauen.. aber das war heute schon irgendwie wieder ätzend.. 400 Zeilen funktionierender Code, aber am Dateiinput bleibt es hängen *g*. Danke euch noch mal : ).
 
Zurück
Oben