Ich habe eine Datei, die bereits einige Daten enthält (etwa 8 kB). Ich möchte etwas vom Anfang der Datei lesen und dann die Daten überschreiben, wo ich mit dem Lesen begonnen habe. Also versuche ich den folgenden Code zu verwenden:Lesen und Schreiben in die gleiche Datei mit dem gleichen fstream
std::fstream stream("filename", std::ios::in | std::ios::out | std::ios::binary);
char byte;
stream.read(&byte, 1);
// stream.seekp(1);
int bytesCount = 4096;
auto bytesVec = std::vector<char>(bytesCount, 'c');
char* bytes = bytesVec.data();
std::cout << stream.bad() << std::endl;
stream.write(bytes, bytesCount);
std::cout << stream.bad() << std::endl;
Wenn ich diesen Code ausführen, die ersten bad()
kehrt false
, aber die zweite kehrt true
und nichts wird tatsächlich geschrieben.
Wenn ich bytesCount
zu etwas kleiner als 4096 (vermutlich die Größe einiger interner Puffer) verringern, die zweite bad()
gibt false
zurück, aber noch nichts geschrieben wird.
Wenn ich die seekp()
Zeile auskommentieren, beginnt das Schreiben zu arbeiten: bad()
gibt false
zurück und die Bytes werden tatsächlich geschrieben.
Warum ist die seekp()
hier erforderlich? Warum funktioniert es nicht ohne es? Ist der seekp()
der richtige Weg, dies zu tun?
Ich bin mit Visual Studio 2012 auf Windows 7.
Ist dies auch für C++ - Streams dokumentiert? Oder folgt MS-Implementierung nicht dem Standard in dieser Hinsicht? – svick
@svick Siehe Aktualisierung. –