2012-08-23 19 views
6

Duplicar posibles:
“while(!feof(file))” is always wronglectura C archivos binarios

Si escribo una matriz para el archivo de salida y cierro el archivo, a continuación, abra el archivo de nuevo y leyó todo hasta el final -of-file se alcanza, aunque el archivo contiene solo 4 números, el programa leerá e imprimirá 5 números, ¿por qué?

La salida del programa:

a[0] = 4 
a[1] = 7 
a[2] = 12 
a[3] = 34 
a[4] = 34 

save.bin (con un editor hexadecimal)

04000000 07000000 0C000000 22000000 

#include <stdio.h> 
#include <stdlib.h> 
#define path "save.bin" 

int main(void) 
{ 
    FILE *f=NULL; 
    int a[]={4,7,12,34},i,n=4,k; 
    f=fopen(path,"wb"); 
    if(f==NULL) 
    { 
    perror("Error"); 
    exit(1); 
    } 
    for(i=0;i<n;i++) // or I could use fwrite(a,sizeof(int),n,f); 
    fwrite(&a[i],sizeof(int),1,f); 
    fclose(f); 
    f=fopen(path,"rb"); 
    if(f==NULL) 
    { 
    perror("Error"); 
    exit(1); 
    } 
    i=0; 
    while(!feof(f)) 
    { 
    fread(&k,sizeof(int),1,f); 
    printf("a[%d] = %d\n",i,k); 
    i++; 
    } 
    printf("\n"); 
    fclose(f); 
    return 0; 
} 
+0

Muchas gracias !!! – Cristi

Respuesta

9

feof(fp) se convierte en falso (es decir, el valor no es cero) sólo si ha intentado leer pasado al final del archivo. Eso debería explicar por qué se ingresó el bucle uno más de lo que esperaba.

Desde el documentation:

The function feof() tests the end-of-file indicator for the stream 
    pointed to by stream, returning nonzero if it is set. The end-of- 
    file indicator can be cleared only by the function clearerr(). 

también leer el mensaje: Why is “while (!feof (file))” always wrong?

+3

+1 para explicar cómo se configura 'feof()'. – hmjd

1
while(!feof(f)) 
{ 
    fread(&k,sizeof(int),1,f); 
    printf("a[%d] = %d\n",i,k); /** THIS ASSUMES fread() WAS SUCCESSFUL. **/ 
    i++; 
} 

Compruebe si el final del archivo immedately después de la llamada a fread() o verifique el valor de retorno de fread(), que devuelve el número de elementos leídos que en este caso debería ser 1. se alcanzó

while(1 == fread(&k,sizeof(int),1,f)) 
{ 
    printf("a[%d] = %d\n",i,k); 
    i++; 
} 

Después de la comprobación de bucle feof() para asegurar EOF y bucle no terminó debido a algún otro fallo: Un posible reestructuración del bucle.

1

Tengo el mismo problema también. Tal vez puedas probar:

i=0; 
    while(true) 
    { 
    fread(&k,sizeof(int),1,f); 
    if(feof(f)) 
     break; 

    printf("a[%d] = %d\n",i,k); 
    i++; 
    } 

Al parecer feof doesnt regresar cierto a menos que haya leído más allá del final del archivo. Lo que hago cuando escribo arreglos en archivos binarios es escribir primero el tamaño, así sé la cantidad exacta de datos que voy a leer cuando los leo nuevamente.