2010-09-05 16 views
8

Si se abre un archivo con el siguiente comando:apertura de un archivo en el modo de 'A +'

FILE *f1=fopen("test.dat","a+"); 

La página del manual dice lo siguiente:

a +

abierto para la lectura y añadiendo (escribiendo al final del archivo). El archivo se crea si no existe. La posición inicial del archivo para la lectura se encuentra al principio del archivo, pero la salida es siempre adjuntada al final del archivo.

Lo mismo sucede con f1 han compensado 2 punteros separados, uno para leer & otro para escribir?

Respuesta

18

Sólo hay un puntero que inicialmente se encuentra al principio del archivo, pero cuando se intenta que se mueve a la final del archivo una operación de escritura. Puede reubicarlo usando fseek o rewind en cualquier parte del archivo para leer, pero las operaciones de escritura lo moverán de regreso al final del archivo.

+0

También puede ser útil saber que esto se implementa típicamente en términos de 'abierto' con el indicador O_APPEND en sistemas POSIX: http://pubs.opengroup.org/onlinepubs/7908799/xsh/open.html –

+0

In case fseek no se llama antes de leer, se imprimen muchos espacios en el código siguiente. No esperaba nada para imprimir en la pantalla. Pero, ¿por qué se imprimen espacios? Eso significa que EOF no se encuentra correctamente. Si descomiento fseek a continuación, los datos se imprimen correctamente en la pantalla. 'int main() { ARCHIVO * fp1; char ch; fp1 = fopen ("m.txt", "a +"); fputs ("datos anexados", fp1); // fseek (fp1,0, SEEK_SET); while ((ch = getc (fp1))!! = EOF) { putc (ch, stdout); } fclose (fp1); return 0; } ' –

4

No, solo tiene un puntero.

3

Puede nunca se mezcla la lectura y operaciones de escritura en un FILE sin llamar fseek en el medio. Puede funcionar como lo desee en algunas implementaciones, pero un programa que depende de esto tiene un comportamiento indefinido. Por lo tanto, las preguntas de tener 2 posiciones no tienen sentido.

+0

Es cierto. Sin embargo, si alguna vez ve una implementación C del sistema operativo que admita las operaciones del archivo POSIX y donde las operaciones stdio FILE no son una capa delgada de buffer sobre las POSIX (que * do * tiene un comportamiento definido en este caso), * por favor * informarlo como un error contra ese sistema operativo. –

+0

@DairaHopwood: Estoy confundido acerca de lo que estás tratando de decir. El problema de mezclar lectura y escritura en stdio sin una búsqueda intermedia es puramente una cuestión de amortiguación. No tiene nada que ver con las operaciones subyacentes en los descriptores de archivos. –

+0

Quiero decir que considero un error de implementación de stdio si su comportamiento indefinido en este caso resulta en algo además de cambiar dónde, si es que se escribe, los datos almacenados en el búfer. Es decir, la especificación debería haber sido que el contenido del archivo resultante está definido por la implementación, en lugar de un comportamiento realmente indefinido. De lo contrario, encontrará que muchos programas tienen errores de seguridad explotables. –

Cuestiones relacionadas