Wiedermal: Probleme beim Lesen einer Datei



  • Hallo.
    Ich versteh nicht ganz warum, das letzte Zeichen zweimal gelesen wird, ich komm gerade nicht drauf.

    std::string testname("");
    while (!inp.eof())	// inp ist ein Objekt von std::ifstream
    {
    	inp.read(&c, sizeof(char));	// c ist ein char
    	if (c == 'F' && !inp.eof())
    	{
    		inp.read(&c, sizeof(char));
    		if (c == 'R' && !inp.eof())
    		{
    			inp.read(&c, sizeof(char));
    			if (c == 'T') break;
    		}
    	}
    	testname.push_back(c);
    }
    

    bei vorkommen von "FRT" in der Datei wird das lesen abgebrochen... Das letzte Zeichen der Datei wird komischerweise zweimal eingelesen, der Rest funktioniert. Ich verstehe nicht ganz warum...

    Gruss
    Cartman



  • Zweimal gelesen werden wird es wohl nicht, aber das alte Zeichen könnte noch in c drinn sein.



  • Also ich empfehle beim Lesen von Dateien eher nicht auf eof zu prüfen. Sondern die schleife eher so zugestalten

    //wenn man ne zeile lesen will
    while(getline(irgendeinfstream,irgendeinstring))
    {
           //tue was
    }
    


  • Firefighter schrieb:

    Also ich empfehle beim Lesen von Dateien eher nicht auf eof zu prüfen. Sondern die schleife eher so zugestalten

    //wenn man ne zeile lesen will
    while(getline(irgendeinfstream,irgendeinstring))
    {
           //tue was
    }
    

    Genau damit hat es auch geklappt, thx...
    Frage: Gilt das fuer alle Leseoperationen? (bei read geht es zumindest)
    z.B.
    get()
    operator>>
    etc.

    Und noch eine Frage speziell fuer read . Wenn ich ein char-Array mit einer bestimmten Menge an Bytes lesen will, es aber nicht mehr genuegend Bytes zu lesen gibt - wird dann die restliche Menge in das char-Array kopiert - oder gibt es dann ein false ? Und wo befindet sich dann der Dateizeiger?
    Fragen ueber Fragen...

    Gruss
    Cartman

    P.S.: Das ist das erste mal, dass es mit eof() nicht geklappt hat - denn bisher hatte ich noch nie Probleme damit...



  • Naja die Grundfrage ist doch, musst du Binär einlesen oder geht es auch über das "normale" einlesen eines strings, wie ist denn deine Datei aufgebaut?



  • Firefighter schrieb:

    Naja die Grundfrage ist doch, musst du Binär einlesen oder geht es auch über das "normale" einlesen eines strings, wie ist denn deine Datei aufgebaut?

    Warum? Es geht um binaeres Einlesen... eigentlich habe ich grad ein weiteres Problem; das koennt ich hier gleich mal fragen.

    ich arbeite zurzeit an einem Datenkomprimierungsprogramm (Dateien lesen und komprimiert wieder in eine neue Datei schreiben). Dazu habe ich meinen eigenen Komprimierungsalgorithmus geschrieben, der auch wunderbar funktioniert.
    Das ganze ist in eine Klasse gekapselt
    Und zwar ist die Klasse so aufgebaut, dass man die Daten in Form eines [/c]std::string[/c] in eine Membervariable speichern muss, mit der dann die Klasse arbeitet (die Daten komprimiert).
    Nun ist es aber so, dass ich eine Datei nicht komplett einlesen will, sondern das ganze Haeppchenweise einlesen will; und haeppchenweise wieder schreiben will. Das Problem dabei ist nur, dass ich nicht weiss, wie ich vorgehen soll, da die Daten ja komprimiert werden und ich beim wieder einlesen nicht mehr weiss, umwieviel komprimiert wurde... ich hoffe es ist einigermassen verstaendlich, was ich meine.
    Wenn ich die Datei komplett in einen std::string lese funktioniert natuerlich alles. Aber gerade das will ich ja vermeiden, weil es bei groesseren Dateien problematisch sein kann.

    Gruss
    Cartman



  • Eric Cartman schrieb:

    [...]Frage: Gilt das fuer alle Leseoperationen? (bei read geht es zumindest)
    z.B.
    get()
    operator>>
    etc.[...]

    Hier steht, wieso man eof vermeiden sollte, es sei denn, man weiss, was man tut.


Anmelden zum Antworten