Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] problema recorriendo un archivo en c

Estas en el tema de problema recorriendo un archivo en c en el foro de C/C++ en Foros del Web. Hola gente, tengo el siguiente problema. Este es mi codigo para procesar las palabras de un archivo Código: FILE *archivo; archivo=fopen(nombrecompleto,"r"); char leido[MAX_WORD]; while(feof(archivo)==0) { ...
  #1 (permalink)  
Antiguo 30/09/2013, 14:42
 
Fecha de Ingreso: octubre-2012
Mensajes: 33
Antigüedad: 11 años, 6 meses
Puntos: 0
problema recorriendo un archivo en c

Hola gente, tengo el siguiente problema. Este es mi codigo para procesar las palabras de un archivo
Código:
FILE *archivo;
    archivo=fopen(nombrecompleto,"r");
    char leido[MAX_WORD];

    while(feof(archivo)==0)
    {
        fscanf(archivo,"%s",leido);
        insertarM(toReturn,leido);//inseta en un TDA 
        printf("inserte %s en un multiset\n",leido);
        insertarM(todos,leido);//inserta en otro multiset
        printf("inserte %s en todos\n",leido);
    }

    fclose(archivo);
Mi problema es que lee dos veces la ultima palabra del archivo. Como puedo hacer para mejorar eso?
  #2 (permalink)  
Antiguo 01/10/2013, 01:36
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: problema recorriendo un archivo en c

Cuando lees la última entrada del archivo, aún no se ha leído la marca de final de archivo. Por eso, en el bucle, intenta hacer una lectura más, que es cuando ya lee la marca de final de archivo. Cuando ocurre esto, lo que te devuelve fscanf() es lo último que había leído antes de leer el fnal de archivo. Para resolver esta aparente repetición de la última lectura, basta con hacer una comprobación justo después de fscanf():

Código C:
Ver original
  1. while(feof(archivo)==0)
  2. {
  3.     fscanf(archivo,"%s",leido);
  4.     /* Comprobar aquí si lo que se ha leído es el final del archivo */
  5.     if (feof(archivo))
  6.         break;
  7.     insertarM(toReturn,leido);//inseta en un TDA
  8.     printf("inserte %s en un multiset\n",leido);
  9.     insertarM(todos,leido);//inserta en otro multiset
  10.     printf("inserte %s en todos\n",leido);
  11. }

Saludos,
  #3 (permalink)  
Antiguo 01/10/2013, 10:35
 
Fecha de Ingreso: octubre-2012
Mensajes: 33
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: problema recorriendo un archivo en c

muchas gracias. Pero ese codigo no solucionara mi problema. En un archivo con dos palabras: Lee la priemera, el if da falso, ejecuto hasta el final. Lee la segunda, el if da falso, ejecuto hasta el final. Lee erroneamente la ultima palabra de nuevo, el if da falso, ejecuto hasta el final. Lee eof, termina.
Si agrego un sacanf luego de la ultima instruccion(linea 10 por ejemplo) voy a perder palabras :s

Última edición por sfermat; 01/10/2013 a las 10:41
  #4 (permalink)  
Antiguo 01/10/2013, 12:28
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: problema recorriendo un archivo en c

Una cosa, el codigo de Fw190 funciona porque sale del bucle cuando aun habiendo entrado en el ciclo se llega a la condicion de eof.

Propongo otra cosa, usa las comprovaciones de estado/error para saber que está haciendo tu ciclo: o se habrá leido correctamente, o se habrá llegado al eof, o se habrá producido un error; sabiendo esto solo tienes que aplicar las tres condiciones

Código C:
Ver original
  1. //ciclo infinito
  2. while(1) {
  3.     //lees y guardas el nº de elementos leidos
  4.     ncr = fscanf(archivo, "%s", leido);
  5.    
  6.     //comprovacion de estado
  7.     if(ncr > 0) {//ok
  8.         printf("%s\n", leido);
  9.     }
  10.     else if(ncr == EOF) {//eof
  11.         printf("EOF\n");
  12.         break;
  13.     }
  14.     else {//error
  15.         printf("Error %d\n", ferror(archivo));
  16.         break;
  17.     }
  18. }

El 'ncr' es un entero. Ten en cuenta que el valor de retorno de fscanf en caso de exito depende del numero de entidades a escanear que le envias como formato, en este caso quieres escanear un %s entonces en la condicion de exito retorna 1. En el codigo he puesto que la condicion de exito sea cuando el nº de entidades sea >0, pero puedes encontrarte casos con una lectura correcta y que el nº de entidades leidas sea 0 (p.ej. si quieres escanear un entero y en el texto solo hay letras).

Si no te fias de controlar correctamente el ciclo infinito puedes regular el ciclo con el feof(archivo) tal como tenias.

Saludos
vosk
  #5 (permalink)  
Antiguo 05/10/2013, 13:49
 
Fecha de Ingreso: octubre-2012
Mensajes: 33
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: problema recorriendo un archivo en c

Cita:
Iniciado por vosk Ver Mensaje
Una cosa, el codigo de Fw190 funciona porque sale del bucle cuando aun habiendo entrado en el ciclo se llega a la condicion de eof.

Propongo otra cosa, usa las comprovaciones de estado/error para saber que está haciendo tu ciclo: o se habrá leido correctamente, o se habrá llegado al eof, o se habrá producido un error; sabiendo esto solo tienes que aplicar las tres condiciones

Código C:
Ver original
  1. //ciclo infinito
  2. while(1) {
  3.     //lees y guardas el nº de elementos leidos
  4.     ncr = fscanf(archivo, "%s", leido);
  5.    
  6.     //comprovacion de estado
  7.     if(ncr > 0) {//ok
  8.         printf("%s\n", leido);
  9.     }
  10.     else if(ncr == EOF) {//eof
  11.         printf("EOF\n");
  12.         break;
  13.     }
  14.     else {//error
  15.         printf("Error %d\n", ferror(archivo));
  16.         break;
  17.     }
  18. }

El 'ncr' es un entero. Ten en cuenta que el valor de retorno de fscanf en caso de exito depende del numero de entidades a escanear que le envias como formato, en este caso quieres escanear un %s entonces en la condicion de exito retorna 1. En el codigo he puesto que la condicion de exito sea cuando el nº de entidades sea >0, pero puedes encontrarte casos con una lectura correcta y que el nº de entidades leidas sea 0 (p.ej. si quieres escanear un entero y en el texto solo hay letras).

Si no te fias de controlar correctamente el ciclo infinito puedes regular el ciclo con el feof(archivo) tal como tenias.

Saludos
vosk
voy a intentar esto, en cuanto al código anterior de Fw160. El problema es que no llega a eof, sino que lee la última palabra dos veces antes del eof. Según el debug en un txt con "uno" "dos" las lecturas de fscan son: uno, dos, dos, eof... Por eso no serviría un control extra... Otra cuestión, estaba programando en linux, al pasar a windows ese mismo bucle pasa a ser infinito... Tiene explicación?
  #6 (permalink)  
Antiguo 05/10/2013, 14:38
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: problema recorriendo un archivo en c

"...al pasar a windows ese mismo bucle pasa a ser infinito... Tiene explicación?..."

No se, siento no ser de mas ayuda; tal vez alguien mas pueda aclarar este punto.

Saludos
vosk
  #7 (permalink)  
Antiguo 05/10/2013, 14:51
 
Fecha de Ingreso: octubre-2012
Mensajes: 33
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: problema recorriendo un archivo en c

dado que los txt tienen solo palabras y para evitar el uso del break, finalmente con este codigo logre lo que queria. Solo me falta probarlo en windows. Muchas gracias

Código C:
Ver original
  1. int ncr =1;
  2.         while(ncr) {
  3.             ncr = fscanf(archivo, "%s", leido);
  4.             //comprovacion de estado
  5.             if(ncr > 0) {
  6.                 insertarM(toReturn,leido);//inseta en un TDA
  7.                 insertarM(todos,leido);//inserta en otro multiset
  8.             }else if(ncr == EOF) {//eof
  9.                     ncr=0;
  10.                     }
  11.                 }
  #8 (permalink)  
Antiguo 05/10/2013, 15:05
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: problema recorriendo un archivo en c

Pero cuando se produce un error tambien tienes que notificarlo, que para eso esta el control de errores. Es una ayuda extra no solo durante las pruebas sino tambien durante el uso normal de las aplicaciones.

Saludos
vosk
  #9 (permalink)  
Antiguo 06/10/2013, 00:32
 
Fecha de Ingreso: octubre-2012
Mensajes: 33
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: problema recorriendo un archivo en c

Lo probé y cuando escanea cualquier cosa que no sea un Sting me retorna - 1 al igual que eof, igual lo agregué para darle más prolijidad al código

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:50.