2011-06-10 7 views
19

relacionadas: fclose return value check¿Debo verificar el estado de devolución de fclose() si solo estoy leyendo un archivo?

Aunque es importante comprobar el valor de retorno de fclose() si usted está escribiendo un archivo (en caso de que falle la operación de vaciado), es necesario que lo haga cuando leer un archivo?

FILE *f = fopen(path, "r"); 
if (f == NULL) 
    return 0; 

/* Do something with the file... */ 

if (fclose(f) != 0) { 
    /* Error closing a file we successfully read. */ 
    return 0; 
} 
+2

Depende de la importancia de los datos que se supone que debe leer. Si falla 'fclose()', es probable que haya un problema durante la lectura también, tal vez porque algo se pisoteó sobre la estructura del flujo de archivos. En ese caso, es posible que no haya leído todos los datos que se suponía que debía y generar una respuesta basada en parte de los datos podría ser un problema. ¿Mucha gente escribe el código para hacer ese control? No; mucha gente no verifica que el cierre tenga éxito. Sin embargo, eso podría deberse a que los datos que se procesan no son críticos. –

+1

@Jonathan, si fread no devuelve errores, ¿por qué asumiría que hubo un error solo por una falla en una llamada al sistema diferente? No puedo imaginarme por qué un archivo abierto para lectura no se cierra, pero si sucede, no creo que pueda suponer que una llamada anterior que no devolvió un error haya fallado. No tiene mucho sentido para mí. – littleadv

+0

@littleadv: ¿Marcó usando 'feof (fp)' versus 'ferror (fp)' si la lectura falló o llegó a EOF? Normalmente no hago eso; No creo que sea una minoría tampoco. Tienes razón; si todas las lecturas anteriores tuvieron éxito y usted confirmó que obtuvo EOF y no un error en la lectura final, entonces es bastante improbable que '' fclose() 'falle. Podría suceder, pero no es probable. Y mencioné las razones más probables para que 'fclose()' fallara, concretamente, el pisoteo de la memoria en alguna forma o forma, o una mala administración del puntero al archivo (sin cerrar el archivo que en realidad tenía abierto). Definitivamente poco probable. –

Respuesta

10

¿Hay algo que podría hacer si falla? Entonces sí. Si no hay nada que puedas hacer, entonces puedes ignorarlo.

La buena práctica es verificar siempre si hay errores y al menos registrarlos, si no hay nada más que pueda hacer al respecto.

0

Si falla el cerrar(), es posible que tenga un error que le interese. Los archivos son más que datos. Son metadatos, y son recursos. Si close() falla, es posible que todavía tenga un identificador de archivo abierto. Es posible que todavía esté fijando los datos del archivo, evitando que el sistema de archivos los reutilice. Es posible que todavía tenga conexiones de red abiertas. Si el momento del archivo se actualiza en close(), tendrá un tiempo inactivo para el archivo. Estas son cosas por las que realmente deberías estar curioso.

Cuestiones relacionadas