Mam plik, który zawiera już pewne dane (na przykład 8 kB). Chcę przeczytać coś od początku pliku, a następnie nadpisać dane od miejsca, w którym skończyłem czytać. Więc staram się użyć następującego kodu:Odczytywanie i zapisywanie do tego samego pliku przy użyciu tego samego pliku 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;
Gdybym wykonanie tego kodu, pierwsze bad()
powraca false
, ale drugi zwraca true
i nic faktycznie dostaje napisane.
Jeśli zmniejszę wartość parametru bytesCount
do wartości mniejszej niż 4096 (prawdopodobnie wielkość bufora wewnętrznego), drugi bad()
zwraca false
, ale nadal nic nie zostanie zapisane.
Gdybym odkomentuj linię seekp()
, pisanie rozpoczyna pracę: bad()
powraca false
i bajtów rzeczywiście dostać napisane.
Dlaczego konieczne jest tutaj seekp()
? Dlaczego nie działa bez niego? Czy seekp()
jest właściwą metodą?
Używam Visual Studio 2012 na Windows 7.
Czy jest to również udokumentowane dla strumieni C++? Czy też wdrożenie MS nie jest zgodne ze standardem w tym zakresie? – svick
@svick Zobacz aktualizację. –