Sto cercando alcuni chiarimenti su come seekg()
e seekp()
funziona rispetto a quando si scrive su un file. Dire per esempio ho avuto un file in questo modo:fstream seekg(), seekp() e write()
offset 0: 2
offset 4: 4
offset 8: 6
offset 12: 8
offset 16: 10
Ora voglio aprire il file e fare un po 'cerca di leggere e scrivere i valori.
fstream file;
file.open("file.txt", fstream::in |fstream::out | fstream::binary);
file.seekp(0, ios::end) // seek to the end of the file
int eofOffset = file.tellp(); // store the offset of the end-of-file, in this case 20
int key = 0;
file.seekg(12, ios::beg); // set the seek cursor to offset 12 from the beginning of the file
file.read((char *) &key, (int)sizeof(int)); // read in the next 4 bytes and assign it to key, in this case 8
file.seekg(8, ios::beg); // set the seek cursor to offset 8 from the beginning of the file
file.read((char *) &key, (int)sizeof(int)); // read in the next 4 bytes and assign it to key, in this case 6
Ora voglio scrivere fino alla fine del file. Poiché la funzione seekg()
sposta solo il cursore di ricerca, il mio cursore seekp()
dovrebbe essere ancora alla fine del file, giusto? Quindi:
int newKey = 12;
file.write((char *) &newKey, sizeof(int));
dovrebbe rendere il mio file apparire così:
offset 0: 2
offset 4: 4
offset 8: 6
offset 12: 8
offset 16: 10
offset 20: 12
Ora che cosa accade al mio file se scelgo di cercare di un offset e scrivere il suo valore come offset per il valore che era appena inserito. Ad esempio, voglio offset 8
per contenere eofOffset = 20
poiché abbiamo appena inserito 12 in tale offset.
Se lo faccio:
file.seekp(8, ios::beg);
file.write((char *) &eofOffset, sizeof(int));
lo fa correttamente riscrivere il mio file di simile a questa:
offset 0: 2
offset 4: 4
offset 8: 20
offset 12: 8
offset 16: 10
offset 20: 12
Si prega di farmi sapere se sto facendo tutti gli errori che utilizzano i seekg()
e seekp()
funzioni.
Grazie! Quindi quando consiglieresti di lavare il buffer? Lo svuoterei dopo ogni lettura e scrittura, o sarebbe meglio lasciarlo così com'è se stai facendo una serie di letture o una serie di scritture? – raphnguyen
@raphnguyen Flussare il buffer è un'operazione relativamente costosa, di solito non è necessario svuotare manualmente a meno che non si passi dalla scrittura alla lettura e non si cerchi, a meno che non si abbia una buona ragione per svuotare lasciare che l'implementazione gestisca altri svuotamenti. – user657267