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