2010-11-27 8 views
7

En diversos ejemplos encontrados en la web fgetc() se utiliza como esto:fgetc(): ¿Es suficiente con solo verificar EOF?

FILE *fp = fopen(PATH, "r"); 

if (fp == NULL) { 
    perror("main"); 
    exit(EXIT_FAILURE); 
} 

int ch; 

while (ch = fgetc(fp) != EOF) { 
    // do something 
} 

Pero de acuerdo con la página de manual a fgetc()

Si se produce un error de lectura, el indicador de error para la corriente de se establecerá, fgetc() devolverá EOF, [CX] y establecerá errno para indicar el error.

¿Necesito comprobar esto también? ¿Y cómo?

+2

Necesita paréntesis alrededor de la asignación: 'while ((ch = fgetc (fp))!! = EOF)', pero con esa corrección en su lugar, es suficiente comprobar solo EOF. Obtendrá EOF por error o EOF real; si lo desea, puede desambiguar los dos casos después del ciclo. –

Respuesta

6

Puede comprobarlo con ferror (3), justo después del tiempo:

while (EOF != (ch = fgetc(fp))) 
    // do something 

if (ferror(fp) != 0) 
    // error handling 

ferror devuelve un valor no nulo si se produjo un error.

Si desea utilizar fp después se produjo un error, tendrá que borrar el indicador de error con clearerr:

clearerr(fp); 
+0

Pero, ¿se saldrá del lazo si ocurre algún error? – helpermethod

+7

@Helper Método: Acabas de citar esa misma declaración en el extracto de tu página de manual. –

4

bucle hasta fgetc vuelve EOF está perfectamente bien. Luego, si desea saber si el ciclo finalizó debido simplemente a que llegó al final del archivo o debido a un error, debe llamar al ferror. Si no le importa, puede omitir la llamada al ferror.

4

Esto es lo que las especificaciones dicen: función

la fgetc() deberá obtener el siguiente byte como un unsigned char convertido a un int

La siguiente nombre de macro se definirán como un entero negativo expresión constante: EOF

mientras se almacena el valor de retorno en un int y no un char, es suficiente para comprobar si hay EOF porque t se garantiza que no representará un valor de carácter válido.


Además, en su código, esto:

while (ch = fgetc(fp) != EOF) 

debería ser: Es necesario

while ((ch = fgetc(fp)) != EOF) 

Los paréntesis adicionales debido != tiene mayor precedencia que =.

Cuestiones relacionadas