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

Fin de fichero en Unix

Estas en el tema de Fin de fichero en Unix en el foro de C/C++ en Foros del Web. Buenas tardes, llevo unas horas pegándome con un pequeño programa en c, añado la parte de código que me da problemas y explico lo que ...
  #1 (permalink)  
Antiguo 08/09/2012, 11:16
 
Fecha de Ingreso: septiembre-2012
Mensajes: 1
Antigüedad: 12 años, 2 meses
Puntos: 0
Fin de fichero en Unix

Buenas tardes, llevo unas horas pegándome con un pequeño programa en c, añado la parte de código que me da problemas y explico lo que me pasa...

Código c:
Ver original
  1. while(opresult != EOF){
  2.                         numcar=0;
  3.                         while(caracter != ';'){
  4.                                 if(numcar>0){fichas[numfich].nombre[i]=caracter;}
  5.                                 opresult=fread (&caracter, sizeof(char), 1, fichero);
  6.                 printf("numero de caracter: %d caracter \" %c \"\n", numcar, caracter);
  7.                                 numcar++;
  8.                                 i++;
  9.                         }
  10.                         numcar=0;
  11.                         i=0;
  12.                         while(caracter != '\n'){
  13.                                 if(numcar>0){fichas[numfich].posicion[i]=caracter;}
  14.                                 opresult=fread (&caracter, sizeof(char), 1, fichero);
  15.                 printf("numero de caracter: %d caracter \" %c \"\n", numcar, caracter);
  16.                                 numcar++;
  17.                                 i++;
  18.                         }
  19.                 numfich++;
  20.                 }

Ahora bien, estoy intentando leer en Ubuntu un fichero caracter a caracter, asta ahí bien, me los lee todos, el problema le tengo cuando me llega a final de fichero que me lee continuamente el caracter '10' que en la tabla ascii es el salto de linea en vez de un EOF por ejemplo...

Perdón, que el código sale sin tabuladores aquí :S si alguien me comenta el problema... muchas gracias

Última edición por ivalle; 08/09/2012 a las 11:41
  #2 (permalink)  
Antiguo 08/09/2012, 19:00
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: Fin de fichero en Unix

Hola! el problema puede deberse a que estas haciendo mal la lectrura... fread no devuelve EOF en caso de error sino que el valor devuelto es indefinido(en este caso puede ser menor a 1); y si la lectura fue correcta devuelve 1 tambien en este caso

Explicacion posible de lo q pasa: Cuando fread lee el ultimo caracter, el ENTER, no se cumple caracter != '\n' entonces se evalua opresult != EOF pero como la lectura fue correcta opresult es igual a 1 provocando q la condicion sea verdadera y a su vez tambien se cumple caracter != ';' por lo tanto entra a ese bucle. Una vez adentro fread intenta leer pero como se llego a EOF la lectura es incorrecta, esto provoca que la variable caracter nose modifique generando un bucle infinito ya que la condicion siempre es verdadera, osea se imprime enter continuamente

Fijate si con esto podes modificar algo, sino segui preguntando. Saludos
  #3 (permalink)  
Antiguo 09/09/2012, 07:53
 
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

Etiquetas: fichero, int, programa, unix, find
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 08:24.