Acceso aleatorio a archivos binarios, a ver si alguien puede ayudarme

Iniciado por Awraaaauu, 23 Junio 2010, 04:41 AM

0 Miembros y 1 Visitante están viendo este tema.

Littlehorse

Nico, abriéndolo en ate sucede el mismo problema. Es decir, en la próxima apertura del archivo, el contenido se vacía.


Cita de: Awraaaauu en 24 Junio 2010, 03:15 AM
Sigue habiendo un problemilla.

::app me sitúa al final del fichero siempre antes de cualquier operación de salida, incluso después de hacer seekp

Bueno, voy a investigar un poco por mi cuenta. Si no consigo nada lo haré sin streams.


Si, precisamente por eso te dije que el calculo de posiciones lo tendrías que cambiar. Es la forma mas fácil para escribir siempre al final del fichero, en todo caso si luego necesitas sobrescribir una sección moviendo el puntero podes abrir el archivo para input/output.

Código (cpp) [Seleccionar]
     fstream grabado;
     grabado.open("datos.dat", ios::out|ios::in| ios::binary);


Pero por supuesto si el archivo no existe esto te dará error, por lo tanto primero tenes que chequear que el archivo exista ya sea abriéndolo para lectura y verificando las salidas:

Citar
On failure, the failbit flag is set (which can be checked with member fail), and depending on the value set with exceptions an exception may be thrown.

o bien utilizando funciones especificas del sistema, o alguna librería multiplataforma.

Saludos!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

nicolas_cof

#11
Cita de: LittlehorseNico, abriéndolo en ate sucede el mismo problema. Es decir, en la próxima apertura del archivo, el contenido se vacía.

Littlehorse, hay una cosa que no entiendo :P, supuestamente ::ate significa append to end, lo cual me lleva a dudar de porque el contenido en una nueva apertura se vacia?

De aca estoy leyendo algo... http://www.cplusplus.com/doc/tutorial/files/

Salu10.

Littlehorse

El problema no es ::ate, el problema es usarlo con ::out. Serian los equivalentes de estos modos de fopen:

Código (cpp) [Seleccionar]

ios::out|ios::in|ios::ate|ios::binary


La posición inicial si estará al final del archivo. Esto seria el equivalente a "r+b si el archivo existe" en C.

pero si haces esto:

Código (cpp) [Seleccionar]
ios::out|ios::ate

El equivalente seria "wb". ios::out implica ios::trunc por lo tanto el contenido se sobrescribe. Al menos que el archivo sea abierto para operaciones simultaneas de lectura y escritura.

Saludos!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

nicolas_cof

Littlehorse, gracias. Siempre se aprende algo nuevo.

Salu10.