2012-05-17 14 views
17
FILE* f = fopen("rajat", "w"); 
fputs("sometext", f); 
fseek(f, 6, SEEK_SET); 
fputs("is a", f); 
fclose(f); 

devuelve correctamente "a": "someteis un"fseek no funciona cuando el archivo se abre en modo (agregar)

Pero

FILE* f = fopen("rajat", "a"); 
fputs("sometext", f); 
fseek(f, 6, SEEK_SET); 
fputs("is a", f); 
fclose(f); 

no funciona. Devuelve "sometextis a"

¿Alguna idea de por qué? ¿Cuál es la solución a esto, para que el segundo código salga exactamente como el primero?

+1

¿No necesita '" w + "' para el primero? De lo contrario, el archivo se destruye y se vuelve a crear. –

Respuesta

24

Al abrir en modo de adición, el puntero al archivo vuelve al final del archivo antes de cada escritura. Puede reposicionar el puntero con fseek para leer, pero tan pronto como llame a una función que escribe en el archivo, el puntero vuelve al final del archivo.

O, dicho de otra manera, para evitar la pérdida de datos, la posición del "puntero de escritura" anula la posición del "puntero de lectura". Después de agregar, el puntero de escritura rebota en el nuevo EOF.

La respuesta en this link hace referencia a la sección correspondiente del estándar C.

Utilice el modo "w+" si desea escribir en lugares arbitrarios en el archivo. Se sobrescribirá un archivo existente.

Si desea agregar un archivo existente inicialmente, pero luego fseek a un lugar arbitrario, utilice "r+" seguido de fseek(f, 0, SEEK_END).

+0

Si no desea que se destruyan los datos existentes en el archivo, debe usar '" r + "', no '" w + "'. –

+0

@JamesKanze Esto es correcto, aclaré este punto en una edición hace unos minutos. Un inconveniente para 'r +' es que el archivo debe existir, sin embargo. – dasblinkenlight

+0

Siempre he encontrado que el comportamiento de '" a "' no es intuitivo. –

Cuestiones relacionadas