Problema Al leer Archivo En C

Iniciado por ZedGe, 22 Enero 2012, 06:20 AM

0 Miembros y 1 Visitante están viendo este tema.

ZedGe

Tengo el siguiente codigo que lee un fichero, con datos separados por coma

EJ:

Juanito,Perez,15,Cancer,Si,5,Si,21.01.2012,Si
Anita,Lava,1,Resfrio,No,5,Si,01.01.2011,No


#include <stdlib.h>
#include <stdio.h>


int cargarTXT()
{
       FILE *fichero;
      char nombre[30];
     

      system("cls");//Se borra la pantalla
      printf("\n\t\t%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176);
      printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176);
      printf("\n\t\t%c                                                 %c",176,176);
      printf("\n\t\t%c                                                 %c",176,176);
      printf("\n\t\t%c      Ingrese Nombre Del Fichero A Cargar:       %c",176,176);
      printf("\n\t\t%c                                                 %c",176,176);
      printf("\n\t\t%c                                                 %c",176,176);
      printf("\n\t\t%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176);
      printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176);
      printf("\n\n");
      scanf("\t\t\t\t\t\t%s",nombre);

      fichero = fopen(nombre,"r");

      if (fichero == NULL){
      printf("No Se Pudo Abrir El Fichero");
      return 0;
      }
   

      char *ptrToken;      //Variable que permite guardar dato entre las comas
      int i=0;
      int j=0;
     char lineas[800];
     char dato[8][8000];
 

    while( !feof(fichero) )  //En caso de leerlo y hasta no llegar al final se ahce esto
{
fscanf( fichero, "%s",lineas);
ptrToken = strtok(lineas, "," ); //Se re-lee la linea hasta encontrar una ',' y se guarda lo leido
        i=0;
while ( ptrToken != NULL ) //Si lo leido hasta una , no es nulo o no hay nada
{
      strcpy(dato[i],ptrToken);
      i++; //Se aumenta el auxiliar i
      ptrToken = strtok(NULL, "," ); //Se obtiene el siguiente token y se sigue en el while
  }
}
   menu();
   fclose(fichero);
}



El problema es que al imprimir los datos lee el ultimo dato de la ultima linea nuevamente, y no se por que.... con una linea funciona.. con 2 no


rir3760

Un error en el programa y, supongo, causa del comportamiento que mencionas es el uso de la función "feof". Salvo contados escenarios se debe evitar el uso de ella en favor del valor de retorno de la función utilizada.

En tu caso fscanf retornara 1 mientras pueda leer una palabra y EOF en caso de error o fin de archivo. Cambia el bucle a:
while (fscanf(fichero, "%s", lineas) == 1){
   ptrToken = strtok(lineas, "," );
   
   i = 0;
   while (ptrToken != NULL){
      strcpy(dato[i],ptrToken);
      i++;
      ptrToken = strtok(NULL, "," );
   }
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

ZedGe

ok muchas gracias =D.....

otra pregunta hay alguna forma de leer el fichero y retornar la cantidad de lineas sin saber el max total de estas ni su largo??

es decir un fichero con 50 caracteres por linea  123 lineas retornara 123

ese mismo fichero pero con 10 caracteres y  123123123 lineas retorne 123123123


ya que como lei yo le asigne un max de 8000... lo que si tengo solo 10 lineas es un gasto de memoria

Xandrete

Cita de: ZedGe en 22 Enero 2012, 11:03 AM
ok muchas gracias =D.....

otra pregunta hay alguna forma de leer el fichero y retornar la cantidad de lineas sin saber el max total de estas ni su largo??

es decir un fichero con 50 caracteres por linea  123 lineas retornara 123

ese mismo fichero pero con 10 caracteres y  123123123 lineas retorne 123123123


ya que como lei yo le asigne un max de 8000... lo que si tengo solo 10 lineas es un gasto de memoria

Cuenta los saltos de línea ('\n') y súmale 1. Por ejemplo.

Saludos