Fehlerhafte Implementierung von readsome()?
-
Hallo,
ich bin auf eine merkwürdiges Verhalten des gcc gestoßen. "readsome()" scheint nicht richtig implementiert zu sein. Wenn man vor dem readsome() ein seekg() ausführt ist der Rückgabewert 0. Wenn man nicht seekt tritt dieses nicht auf.
Beispiel:
#include <fstream> #include <iostream> using namespace std; int main() { const char FILENAME[] = "test.dat"; // Dateiname // zu schreibende Datei öffnen fstream ofile; ofile.open( FILENAME, ios::binary|ios::out ); if( !ofile.is_open() ) { cerr << "Fehler beim Oeffnen der Schreibdatei: " << FILENAME << endl; return 1; } // Werte 1...3 in Datei schreiben short var = 1; ofile.write ( reinterpret_cast<char*>( &var ), sizeof( var ) ); var++; ofile.write ( reinterpret_cast<char*>( &var ), sizeof( var ) ); var++; ofile.write ( reinterpret_cast<char*>( &var ), sizeof( var ) ); // zu schreibende datei schließen ofile.close(); // zu lesende Datei öffnen fstream ifile; ifile.open( FILENAME, ios::binary|ios::in ); if( !ifile.is_open() ) { cerr << "Fehler beim Oeffnen der Lesedatei: " << FILENAME << endl; return 1; } // 1. Wert einlesen ifile.readsome( reinterpret_cast<char*>( &var ), sizeof( var ) ); cout << "Erster Wert : " << var << endl; // Auf letzten Wert positionieren und lesen ifile.seekg( static_cast<streamoff>( -sizeof( var ) ), ios::end ); ifile.readsome( reinterpret_cast<char*>( &var ), sizeof( var ) ); cout << "Letzter Wert : " << var << endl; // zu lesende Datei schließen ifile.close(); return 0; }
Erwartete Ausgabe:
Erster Wert : 1
Letzter Wert : 3Reale Ausgabe ( g++ (GCC) 3.3 20030226 (prerelease) für i686 Linux ):
Erster Wert : 1
Letzter Wert : 1Reale Ausgabe ( g++ (GCC) 3.2 für SunOS (sun4u) ):
Erster Wert : 3
Letzter Wert : 3Liege ich mit meiner Vermutung richtig, oder was ist da los?
Viele Grüße
Bastian
-
also bei mir kommt die erwartete ausgabe. Ich nutze die gcc 3.3.2
probier ansonsten mal std::istream::read
-
Hallo,
readsome ließt imo nur min(N, rdbuf()->in_avail())-Zeichen. Sollte in_avail() also 0 liefern, dann wird nichts gelesen, egal wie groß N ist.
Sollte also vor dem ersten readsome die Annahme:assert(ifile.rdbuf()->in_avail());
fehlschlagen, dann ist dein Ergebnis nicht verwunderlich.
Diese Verhalten ist soweit ich weiß auch legal, da open noch keine Zeichen bereitstellen muss.
-
Okay, das sehe ich ein. Wie kann ich dann aber erfahren wieviele Bytes ich denn tatsächlich gelsen habe? (read() hat ja keinen Rückgabewert)
-
read() hat ja keinen Rückgabewert
Dazu kannst du die Methode gcount verwenden. Also erst read aufrufen und dann gcount. gcount liefert die Anzahl der zuletzt gelesenen Zeichen.