Ver Mensaje Individual
  #5 (permalink)  
Antiguo 26/03/2014, 05:50
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Error con el buffer en archivo de texto

@TriN: "...y otra pregunta hay que aprovechar, xD xq rayos se imprimia un campo de mas ?..."

Bueno, realmente se imprimia un campo de mas porque no hacias las comprovaciones correctas. Pongo tu primer codigo otra vez (el que no funciona):

Código C:
Ver original
  1. while(!feof(archivo)) {
  2.     fscanf(archivo,"%s",&temp);
  3.     printf("%s \t\t",temp);
  4. }


Tal como te comente fscanf retorna el numero de entidades leidas (y copiadas en los bufers proporcionados), en este caso pides 1 entidad %s y proporcionas un char*, por lo tanto debes esperar que fscanf retorne 1 y copie algo en el char*. En la ultima ciclo, cuando duplica el ultimo campo, fscanf retorna 0 y no copia nada en el char*, pero como no compruebas el valor de retorno presupones que está leyendo algo nuevo y muestras lo ultimo que habia copiado en el bufer (es decir duplicas el ultimo campo).

Puedes aplicar la modificacion sobre tu primer codigo e ira igual de bien:

Código C:
Ver original
  1. while(!feof(archivo)) {
  2.     if(fscanf(archivo,"%s", &temp) == 1) {
  3.         printf("%s \t\t", temp);
  4.     }
  5.     else {
  6.         if(feof(archivo)) {
  7.             //final de archivo
  8.         }
  9.         else if (ferror(archivo)) {
  10.             //error conocido
  11.         }
  12.         else {
  13.             //error inesperado
  14.         }
  15.     }
  16. }


Con esto puedes ver la importancia de los valores de retorno de las funciones y la importancia de las comprovaciones de seguridad.

Saludos
vosk