[ Foro de C ]

Leer datos de un archivo

29-Apr-2009 17:15
laura perez sanchez
6 Respuestas

Hola; cuando intento leer los caracteres de un fichero mediante un bucle while (con la condicion de salida que sea distinto de final de fichero) y le pido que los visualice, me saca un caracter "raro" donde deberia estar el final del fichero. ¿Alguien sabría decirme porqué? o en su defecto, ¿cómo hay que hacer, para conseguir lo que quiero? Gracias. Un saludo.
30-Apr-2009 01:59
Nacho Cabanes (+83)

Pon el código fuente para que veamos exactamente qué ocurre. En principio, parece que intentas leer más allá del final del fichero, porque tomes el dato y lo manipules antes de comprobar si realmente se ha alcanzado el "feof".

Pero insisto: sin ver el código fuente, todo son suposiciones...


30-Apr-2009 17:23
laura perez sanchez

La función que utilizo para leer los caracteres de nuestro fichero es: contar (FILE *f){ int num_elem; char car; num_elem=0; while (!feof(f)) { car=fgetc(f); printf ("%c\n", car); num_elem=num_elem+1; } return num_elem; } Gracias. Un saludo.
30-Apr-2009 17:25
laura perez sanchez

No me deja poner el código, en posición vertical. Lo siento. Si alguien sabe como solucionarlo que me lo diga y lo vuelvo a enviar.
30-Apr-2009 18:29
Nacho Cabanes (+83)

Es el problema que me temía:

while (!feof(f))
= repite mientras no se haya acabado aún

car=fgetc(f)
= intenta leer una letra...
(pero no compruebas si esa letra se ha podido leer o si es en este momento cuando se ha acabado el fichero

printf ("%c\n", car);
= escribe esa letra... que quizá no hayas podido leer.

La idea importante es que "feof" se actualiza cuando intentas leer y ya no hay datos, no cuando lees el último dato. Por eso, el "printf" y el contador deberían estar dentro de una comprobación:

if (!feof(f)) {
...


30-Apr-2009 19:07
Santiago Ibáñez

Hola, te cuento que no estoy completamente seguro de mi respuesta, pero creo que podes conservar la estructura del programa, simplemente cambiando while(condicion){...} por do{...}while(condicion); Espero que te sirva de algo esto. Saludos.


01-May-2009 02:15
Nacho Cabanes (+83)

Me temo que no es así: no sólo influye si el bucle es un while o un do..while. Es sería importante si leyera el dato en la orden "while" o inmediatamente antes de ella, sin llegar a utilizar el dato.

Mientras dentro del bucle lea un dato y luego intente usarlo sin comprobar si realmente se ha podido leer, tendrá problemas.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)