Ver Mensaje Individual
  #2 (permalink)  
Antiguo 22/05/2014, 05:22
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: Leer fichero en c

La idea es leer linea por linea en vez de caracter por caracter tal como tienes en tu codigo, una vez tienes cada linea, la tokenizas por el caracter que quieres usar como separador (en tu caso la coma , ) y ya tienes lo que sería el substring.

Para eso tienes dos opciones: leer todo el archivo en un buffer, tokenizar por saltos de linea para obtener cada linea y tokenizar cada linea por comas; o bien leer linea por linea y tokenizar por comas.

Lo mas facil es leer linea por linea: para eso usas la funcion fgets (echa un vistazo a tu manual de c para ver los argumentos y valores de retorno de esta funcion). Un trozo de codigo para obtener cada linea:

Código C:
Ver original
  1. FILE *arx;
  2. char *rv, line[MAXLINELENGTH];
  3.  
  4. if((arx = fopen("test.txt", "r"))) {
  5.     while(1) {
  6.         if((rv = fgets(line, sizeof(line), arx))) {
  7.             //lectura positiva
  8.             //volcado para comprovacion
  9.             printf("%s\n", line);
  10.            
  11.             //aqui tokenizas el 'line'
  12.             ...
  13.         }
  14.         else {
  15.             //se produjo algun error
  16.             //recuperas el error y notificas al usuario
  17.             if(ferror(arx)) {
  18.                 //error de lectura
  19.             }
  20.             else if(feof(arx)) {
  21.                 //final de archivo, no necesitas notificarlo
  22.             }
  23.            
  24.             //en cualquier caso de error finalizas el ciclo
  25.             break;
  26.         }
  27.     }
  28.  
  29.     fclose(arx);
  30. }
  31. else {
  32.     //error de acceso
  33. }

Te he comentado lo mas importante en el codigo, hasta aqui todo ok?

Ahora la funcion para tokenizar la linea. Una vez tienes el 'line' quieres separar la parte de antes de la coma, eso se llama tokenizar. Puedes usar la funcion strtok que sirve exactamente para eso. Ten en cuenta que esta funcion modifica la cadena de texto que le envias; como alternativa tienes la implementacion reentrante strtok_r (no forma parte del estandar, tienes que buscarla por internet o crearla tu mismo, pero es muy facil encontrarla por ahi).

Ahora vamos a la linea de los ..., despues de obtener la 'line' le aplicas el strtok y obtienes directamente lo que buscas (tienes que declarar una nueva variable char *pch):

Código C:
Ver original
  1. //aqui tokenizas el 'line'
  2. if((pch = strtok(line, ","))) {
  3.     //ok ya lo tienes
  4.     printf("%s\n", pch);
  5. }

Creo que no hay nada mas que comentar, espero que te sea de ayuda

Saludos
vosk