c++ - español - fstream seekg(), seekp() y write()
seekg c++ español (1)
La plantilla de clase std::basic_filebuf
tiene una sola posición de archivo
§ 27.9.1.1
- La clase basic_filebuf asocia la secuencia de entrada y la secuencia de salida con un archivo.
- Las restricciones para leer y escribir una secuencia controlada por un objeto de la clase basic_filebuf son las mismas que para leer y escribir con el archivo estándar de la biblioteca C.
- En particular:
- Si el archivo no está abierto para leer, la secuencia de entrada no se puede leer.
- Si el archivo no está abierto para escribir, la secuencia de salida no se puede escribir.
- Se mantiene una posición conjunta del archivo tanto para la secuencia de entrada como para la secuencia de salida.
Lo que esto significa es que cuando usas un std::basic_fstream
, que de manera predeterminada usa un std::basic_filebuf
, la posición del archivo único se mueve tanto por seekp()
como por seekg()
; a menos que use una variable separada para almacenar una de las posiciones para poder buscarla, no puede hacer un seguimiento de las posiciones de colocación y de obtener de forma independiente.
Las implicaciones del punto 2 son que entre las lecturas y las escrituras en una fstream
, debe vaciar el búfer o buscar la posición del archivo al cambiar de salida a entrada, y debe estar al final del archivo o buscar la posición del archivo al cambiar De entrada a salida.
Para obtener detalles sobre estas restricciones, consulte la sección 7.19.5.3/7 del estándar C99 ("La función de apertura"), o 7.21.5.3/7 de C11.
Estoy buscando alguna aclaración sobre cómo se seekg()
y seekp()
con respecto a cuándo estás escribiendo en un archivo. Digamos, por ejemplo, que tenía un archivo así:
offset 0: 2
offset 4: 4
offset 8: 6
offset 12: 8
offset 16: 10
Ahora quiero abrir el archivo y hacer algunos intentos de leer y escribir valores.
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
Ahora quiero escribir al final del archivo. Dado que la función seekg()
solo mueve el cursor de búsqueda, mi cursor de seekp()
todavía debe estar al final del archivo, ¿no? Asi que:
int newKey = 12;
file.write((char *) &newKey, sizeof(int));
Debería hacer que mi archivo ahora se vea como:
offset 0: 2
offset 4: 4
offset 8: 6
offset 12: 8
offset 16: 10
offset 20: 12
Ahora, ¿qué sucede con mi archivo si elijo buscar un desplazamiento y escribo su valor como el desplazamiento en el valor que se acaba de insertar? Por ejemplo, quiero que el offset 8
contenga eofOffset = 20
ya que solo eofOffset = 20
12 en ese offset.
Si lo hago:
file.seekp(8, ios::beg);
file.write((char *) &eofOffset, sizeof(int));
¿Reescribe correctamente mi archivo para verse así?
offset 0: 2
offset 4: 4
offset 8: 20
offset 12: 8
offset 16: 10
offset 20: 12
Por favor, avíseme si estoy cometiendo algún error al usar las seekg()
y seekp()
.