Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ZedGe en 22 Enero 2012, 06:20 am



Título: Problema Al leer Archivo En C
Publicado por: ZedGe en 22 Enero 2012, 06:20 am
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

Código:
#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



Título: Re: Problema Al leer Archivo En C
Publicado por: rir3760 en 22 Enero 2012, 07:23 am
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:
Código
  1. while (fscanf(fichero, "%s", lineas) == 1){
  2.   ptrToken = strtok(lineas, "," );
  3.  
  4.   i = 0;
  5.   while (ptrToken != NULL){
  6.      strcpy(dato[i],ptrToken);
  7.      i++;
  8.      ptrToken = strtok(NULL, "," );
  9.   }
  10. }

Un saludo


Título: Re: Problema Al leer Archivo En C
Publicado por: 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


Título: Re: Problema Al leer Archivo En C
Publicado por: Xandrete en 22 Enero 2012, 11:27 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