2012-05-18 18 views
5

Recibo un error muy extraño al intentar leer un archivo de texto simple con la llamada c fread().
hice un programa muy simple para mostrar que el error:¿Por qué ftell() muestra una posición incorrecta después de fread()?

int main(int argc ,char ** argv) { 
    FILE* fh = fopen("adult.txt","r"); 
    if(fh==NULL){ 
    printf("error opening file\n"); 
    exit(0); 
    } 

    int s = 1000; 
    printf("cur before=%d\n",ftell(fh)); 
    char* b = malloc (sizeof(char)*s); 
    int k =fread(b,sizeof(char),s,fh); 
    printf("cur after reading %d bytes =%d\n",k,ftell(fh)); 

    return EXIT_SUCCESS; 
} 

Y lo que me pasa como salida:

cur before=0 
cur after reading 1000 bytes =1007 

¿Eso es normal? fread devuelve el número '1000' pero el cursor (con ftell()) muestra 1007 y se apreciará cualquier ayuda.

Respuesta

10

Eso es normal.

'\n' se pueden representar con dos caracteres, por lo que se produce un sesgo.

Si no desea que eso suceda, abra finalmente en modo binario.

+0

gracias, no lo sabía. Pero no entiendo por qué el retorno de fread() no es lo mismo que la posición del cursor? – ezzakrem

+1

@ezzakrem Porque 'fread' interpretará el final de la línea (que puede tener dos caracteres) como un carácter, y lo informará como uno solo. –

4

De la documentación de ftell:

or binary streams, the value returned corresponds to the number of bytes from the beginning of the file. For text streams, the value is not guaranteed to be the exact number of bytes from the beginning of the file, but the value returned can still be used to restore the position indicator to this position using fseek.

Así que sí, esto es normal.

+0

gracias que ayuda! – ezzakrem

1

La respuesta de Let_Me_Be es correcta. Solo estoy explicando aquí que el carácter 'End of Line' (EOL) depende del sistema operativo subyacente. Por ejemplo, en Windows si abre un archivo con 'r' (o no binario), cada vez que haya una secuencia de '\ r \ n', el sistema operativo devolverá '\ n'. Del mismo modo, cuando escribe en un archivo que no está abierto en modo binario, en Windows escribirá '\ r \ n' cuando simplemente escriba '\ n'. Para los sistemas Unix, no existe tal traducción por SO. Los Mac clásicos usarían '\ r' para el carácter de fin de línea, pero creo que ahora usan '\ n' para EOL. Espero que aclare la palabra de moda de '\ n' para ser representada (posiblemente) por varios caracteres (\ r \ n).

+0

¡gracias! eso lo deja muy claro. – ezzakrem

Cuestiones relacionadas