Ver Mensaje Individual
  #3 (permalink)  
Antiguo 09/09/2012, 07:53
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: Fin de fichero en Unix

La funcion 'fread' retorna el numero de bloques de datos del tamaño indicado que ha sido capaz de leer, o un numero basura por defecto. La condicion de error en lectura se cumple cuando el numero de bloques de datos leido es diferente del numero de bloques de datos que le indicas, y el significado es que se produjo un error o que se llegó al final del archivo.

Puedes llamar a feof() para comprovar si estas leyendo fuera del ambito del stream con el que trabajas (nota que se puede actualizar con fseek, rewind y fsetpos), y tambien puedes (o debes) echar mano a la comprovacion de error de lectura con ferror().

Ten en cuenta que el el codigo que colgaste no estas unsando ninguna comprovación de error (maxima de la programcion: 'que funcione donde estas trabajando no significa que funcione en otro sitio'), y precisamente eso te puede ayudar a salir del bucle, un ejemplo:

Código:
//bucle sobre flag de final de archivo
while(!feof(fichero)) {
        //lee 1 bloque
        num_bloques_leidos = fread (&caracter, sizeof(char), 1, fichero);

        //comprueba errores
        if(ferror(fichero)) {
                //peligro, finaliza el bucle
                break;
        }

        //contrasta con el numero de bloques indicados en la funcion fread
        if(num_bloques_leidos != 1) {
                //mas peligro, finaliza el bucle
                //normalmente o se usa esta comprovacion o se usa el ferror, pero no las dos
                break;
        }

        //ok, tienes un nuevo caracter disponible
        operacion_con_caracter();
}

saludos
vosk