Dev - C++ - Problema en la lectura de fichero.

 
Vista:

Problema en la lectura de fichero.

Publicado por jbernouilli (1 intervención) el 25/03/2016 19:52:08
Tengo un problema en un programa trivial, pero que no consigo solucionar. He escrito a mano unos cuantos numeros enteros en un fichero de texto, al leerlos aparece siempre el mismo problema, el último número lo lee dos veces. El código es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
int contador=0;
char dato;
f=fopen("test.dat","rt");
while(!feof(f))
{
    fscanf(f,"%c",&dato);
    printf("%c\n",dato);
    contador++;
}
fclose(f);
 
printf("Contador:%d",contador);

todas las variables involucradas están definidas.

Si alguien me pudiese ayudar estaría muy agradecido. Gracias de antemano y un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 338
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema en la lectura de fichero.

Publicado por Martín (158 intervenciones) el 26/03/2016 05:09:58
El lenguaje C se creó hace ya 44 años, y en esa época leer un archivo hasta feof() tenía sentido, aunque creo que desde hace unos 30 años que ya esa forma no funciona. ¡Pero qué bueno saber que hay un veterano de esas épocas interesado en el C !

En tiempos remotos los archivos se escribían en cinta, y para indicar su terminación se escribía como último carácter una "marca de fin de archivo", que ese feof() era capaz de leer y avisar que se había alcanzado. A partir de que los archivos no tienen esa marca, feof() devuelve un int distinto de 0 cuando el Indicador de Fin de Archivo del flujo de archivo asociado está activo. Para que ese Indicador esté activo, es necesario que alguna función lo haya activado previamente.

Entonces, en tu código,
fscanf(f,"%c",&dato);
es la función que termina activando ese indicador cuando falla al intentar leer más allá del último carácter en el archivo, de modo que después de que fscanf falla, se ejecuta printf() y contador++, para que la próxima ejecución de feof() encuentre el indicador end-of-file, aunque un poco tarde Alguien hubiera dicho "falló por un tantito así" (já, seguro que te acuerdas paisano).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema en la lectura de fichero.

Publicado por aguml (522 intervenciones) el 26/03/2016 17:05:16
fscanf retorna el número de valores leídos así que debes controlar su salida y cuando valga 0 será porque llegó al final así que con un condicional lo solucionas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar