Ho un file che contiene già alcuni dati (ad esempio, 8 kB). Voglio leggere qualcosa dall'inizio del file e quindi sovrascrivere i dati che iniziano dove ho finito di leggere. Quindi cerco di utilizzare il seguente codice:Leggere e scrivere sullo stesso file usando lo stesso flusso
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;
Se eseguo questo codice, i primi bad()
rendimenti false
, ma il secondo restituisce true
e nulla in realtà viene scritto.
Se si riduce bytesCount
a un valore inferiore a 4096 (presumibilmente la dimensione di un buffer interno), il secondo bad()
restituisce false
, ma non viene ancora scritto nulla.
Se si disattiva la riga seekp()
, la scrittura inizia a funzionare: bad()
restituisce false
e i byte vengono effettivamente scritti.
Perché è necessario il numero seekp()
qui? Perché non funziona senza di esso? Lo seekp()
è il modo giusto per farlo?
Sto utilizzando Visual Studio 2012 su Windows 7.
È documentato anche per gli stream C++? Oppure l'implementazione della SM non segue lo standard in questo senso? – svick
@svick Vedi aggiornamento. –