2010-02-24 9 views
8

Con fwrite devolver el número de elementos de éxito escritos en el archivo, diciendo:Comprobación para el éxito de fwrite en C, perror

if (!(fwrite(...))) { 
    fprintf(stderr, "Failure"); 
    //perror(???) I sometimes see code that says perror here and I don't know 
    //exactly what this does. 
} 

hace esto verificación para la escritura con éxito en el fichero? ¿Hay otras cosas de qué preocuparse?

Gracias.

Respuesta

11

En resumen, no del todo. fwrite devuelve la cantidad de elementos escritos con éxito; necesita verificar esto en función de la cantidad de elementos que desea escribir, es decir, los que aprobó en el argumento para escribir.

Lo que has hecho comprueba que se hayan escrito algunos elementos.

Aquí hay una referencia para perror.

interpreta el valor de la variable global errno en una cadena y impresiones de esa cadena en stderr (flujo de salida error estándar, por lo general la pantalla ), Opcionalmente anterior con el mensaje personalizado que se especifica en str. errno es una variable integral cuyo valor describe el último error producido por una llamada a la función de biblioteca . Las cadenas de error producidas por perror dependen de la plataforma y compilador en desarrollo. Si el parámetro str no es un puntero nulo, se imprime str seguido de dos puntos (:) y un espacio. Entonces, si str era un puntero nulo o no, la descripción del error generado se imprime seguido de por un carácter de nueva línea ('\ n'). Perror se debe llamar justo después de que se produjo el error , de lo contrario puede ser sobrescrito en llamadas a otras funciones .

+5

No es necesario comparar 'fwrite' con el número de elementos si se organiza siempre para llamarlo con el elemento' 1' de tamaño 'len'. Entonces los posibles valores de retorno son solo 0 y 1, donde 0 indica cualquier falla y 1 indica éxito. –

2

Es posible que su código no compruebe correctamente los errores. Utilice

if (fwrite(ptr, size, num, f) != num) { 
    // An error occurred, handle it somehow 
} 
+3

@mctylr: Incorrecto. 'fwrite' no puede manejar' EAGAIN' o 'EINTR' en absoluto. Establecerán el indicador de error para la transmisión, y no hay forma de reanudar la escritura sin perder o duplicar datos (debido a que no se conoce el estado del búfer). Si desea utilizar señales de interrupción o desea configurar un archivo como no bloqueante, stdio generalmente no se puede utilizar. –

0

Desde la página del Linux de fwrite

fread() y fwrite() devuelve el número de elementos de leer correctamente o escrito (es decir, no el número de caracteres). Si se produce un error, o se llega al final del archivo, el valor de retorno es un recuento breve de elementos (0 cero).

por lo que debe comparar con lo que se espera el valor de retorno.

En muchos casos puede ser necesario para comprobar si hay errno igual a EAGAIN o EINTR, en cuyo caso, que normalmente quiere volver a intentar la petición de escritura, mientras que en otros casos se desea manejar las escrituras cortas con gracia.

Para fwrite, en un relato corto(donde menos se escribió la totalidad de sus datos) se puede comprobar feof() y/o ferror() para ver si la corriente está regresando y de fin de archivo, EOF, como si se cerró un PIPE, o si el flujo tiene su indicador inducator de error establecido.

+0

Vea mi comentario en su otro comentario. Volver a intentarlo como dices dará como resultado una falla repetida y/o corrupción de datos. –

+1

Sí, lo escribí y he solucionado mi error original. Un programa puede intentar llamar 'fwrite()' después de llamar 'clearerr()' de forma segura, comprobando nuevamente si continúa el error/falla/EOF, según entiendo. – mctylr

0
STRERROR(3)   FreeBSD Library Functions Manual   STRERROR(3) 

NAME 
    perror, strerror, strerror_r, sys_errlist, sys_nerr — system error mes‐ 
    sages 

LIBRARY 
    Standard C Library (libc, -lc) 

SYNOPSIS 
    #include <stdio.h> 

    void 
    perror(const char *string); 

    ... 

DESCRIPTION 
    ... 

    The perror() function finds the error message corresponding to the cur‐ 
    rent value of the global variable errno (intro(2)) and writes it, fol‐ 
    lowed by a newline, to the standard error file descriptor. If the argu‐ 
    ment string is non‐NULL and does not point to the null character, this 
    string is prepended to the message string and separated from it by a 
    colon and space (“: ”); otherwise, only the error message string is 
    printed. 

... 

STANDARDS 
    The perror() and strerror() functions conform to ISO/IEC 9899:1999 
    (“ISO C99”). ... 
Cuestiones relacionadas