2012-02-22 20 views
10

cuando leí de un archivo usando fread (lenguaje C), el valor de retorno de fread veces sería 0.do fread y fwrite tienen una falla? cómo manejar esto?

Como sugiere el manual:

fread() y fwrite() devolverá el número de elementos leídos con éxito o escrito

¿Tengo que escribir un código como este?

int bytes_read; 
while((bytes_read = fread(buffer, sizeof(int), 1, fp)) == 0) { 

} 

¿Siempre tenemos que comprobar si el fread o fwrite tuvieron éxito?

Respuesta

11

No, no tiene sentido hacer un ciclo de reintento como este si fread o fwrite devuelve menos del número esperado de registros leídos o escritos. Es decir, stdio no es como las operaciones de bajo nivel read y write que pueden dar como resultado lecturas o escrituras "cortas".

Si fread devuelve menos del número de registros solicitados, o ha pulsado EOF o un error grave de lectura. Puede distinguir entre ellos marcando feof() y ferror().

Del mismo modo, si fwrite devuelve menos del número solicitado de registros, o se ha quedado sin espacio en disco o ha cometido un grave error de escritura.

En cualquier caso, debido al almacenamiento en memoria tampón, stdio hace que sea prácticamente imposible saber cuánto se ha escrito correctamente, por lo que si encuentra un error de escritura, normalmente debe considerar la pérdida del archivo y cancelar toda la operación.

0

Sí.

El valor de retorno siempre debe ser recuento.

Si no es así, debe usar ferror() o feof() para determinar si ha llegado al final del archivo y/o ha encontrado un error.

Ignorar los errores y/o las condiciones inesperadas es el material del que se desprende un software no confiable para los usuarios desprevenidos.

http://www.cplusplus.com/reference/clibrary/cstdio/fread/ < - basura

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

+1

No, el valor de retorno es 'count', no' size * count', cuando toda la operación tiene éxito. –

+0

@R .. - Uh ... No creo que sea correcto. ¿Estás seguro? ¿Tiene documentos que no concuerdan con el que publiqué? – Steve

+0

@R .. - Estoy bastante seguro de que si solicita "5" elementos de tamaño "10", la respuesta debería ser "50", no "5". – Steve

4

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

Al completar con éxito, fread() deberá devuelve la cantidad de elementos leídos con éxito que es menor que nitems solo si se encuentra un error de lectura o fin de archivo. Si size o nitems es 0, fread() devolverá 0 y el contenido de la matriz y el estado de la secuencia se mantendrán sin cambios. De lo contrario, si se produce un error de lectura, se establecerá el indicador de error para la transmisión, y se establecerá errno para indicar el error. función

http://pubs.opengroup.org/onlinepubs/007904875/functions/fwrite.html

El fwrite() devolverá el número de elementos escritos con éxito, lo que puede ser inferior a nitems si se encuentra un error de escritura. Si tamaño o nitems es 0, fwrite() devolverá 0 y el estado de la secuencia permanece sin cambios. De lo contrario, si se produce un error de escritura, el indicador de error para la secuencia se establecerá y errno se configurará para indicar el error

Las funciones ferror() o feof() se deben usar para distinguir entre una condición de error y una condición de fin de archivo.

0

Si el error falla, normalmente seguirá fallando. Normalmente, porque toca el final del archivo, pero posiblemente por algún otro motivo. Si falla, normalmente no volverías a intentarlo.

Cuestiones relacionadas