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

Problema al parsear un archivo

Estas en el tema de Problema al parsear un archivo en el foro de C/C++ en Foros del Web. Buenos días, tengo un problema al parsear una cadena de un archivo, llevo tres días tratando de solucionarlo, así que recurriré a ustedes. El programa ...
  #1 (permalink)  
Antiguo 17/03/2013, 13:25
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 3 meses
Puntos: 13
Problema al parsear un archivo

Buenos días, tengo un problema al parsear una cadena de un archivo, llevo tres días tratando de solucionarlo, así que recurriré a ustedes.

El programa parsea esta linea de un archivo:
Código C:
Ver original
  1. # Depends on: fontconfig-32 freeglut-32 xorg-libxcomposite-32 xorg-libxcursor-32 xorg-libxinerama-32 xorg-libxrandr-32 xorg-libxxf86dga-32 alsa-lib-32 libpng-32 libjpeg-32 prelink

El problema está en que me imprime siempre un residuo de la cadena anterior, a ver... este es el código:

Código C:
Ver original
  1. int main(int argc, char *argv[]) {
  2.     char *pkgfile = search_pkgfile("wine");
  3.     char *test;
  4.      
  5.     while ((test = dependencies_pkgfile(pkgfile)) != NULL) {
  6.         printf("%s\n", test);
  7.         free(test);
  8.     }
  9.    
  10.     free(pkgfile);
  11.     return 0;
  12. }
  13.  
  14. char *dependencies_pkgfile (char *dir_pkgfile)
  15. {
  16.     FILE *pkgfile = fopen(dir_pkgfile, "r");
  17.     static int c_n = 0;
  18.     static char depends_p[2000];
  19.     char *depends_po = depends_p;
  20.    
  21.     while ((fgets(depends_p, sizeof(depends_p), pkgfile) != NULL)) {
  22.         if (strncmp(depends_p, "# Depends on:", 13) == 0) {
  23.             depends_po = (depends_po+c_n)+13;
  24.            
  25.            
  26.             while (!(isalpha(*depends_po)) && (*depends_po != '\0' && depends_po++));
  27.             if (*depends_po == '\0') {
  28.                 fclose(pkgfile);
  29.                 return NULL;
  30.             }
  31.             else {
  32.                 depends_po = depends_po-1;
  33.             }
  34.            
  35.             char *depends = malloc(0);
  36.             int c_d = 0;
  37.            
  38.             while (*depends_po != '\0' && depends_po++) {
  39.                 if ((*depends_po == ' ' || *depends_po == '\0') && *(depends_po-1) != ' ') {
  40.                     depends = realloc(depends, c_d+1);
  41.                     depends[c_d] = '\0';
  42.                    
  43.                     fclose(pkgfile);
  44.                     return depends;
  45.                 }
  46.                 else if ((isalpha(*depends_po)) || (isdigit(*depends_po)) || *depends_po == '-') {
  47.                     depends = realloc(depends, c_d+1);
  48.                     depends[c_d] = *depends_po;
  49.                    
  50.                     c_d++;
  51.                     c_n++;
  52.                 }
  53.             }
  54.            
  55.             fclose(pkgfile);
  56.             return NULL;
  57.         }
  58.     }
  59.    
  60.     fclose(pkgfile);
  61.     return NULL;
  62. }

Y me imprime así:

Código HTML:
Ver original
  1. fontconfig-32
  2. freeglut-32
  3. xorg-libxcomposite-32
  4. xorg-libxcursor-32
  5. r-32 #Esto no deberia imprimirlo
  6. xorg-libxinerama-32
  7. xorg-libxrandr-32
  8. xorg-libxxf86dga-32
  9. alsa-lib-32
  10. b-32 #Esto no deberia imprimirlo
  11. libpng-32
  12. libjpeg-32
  13. prelink
  14. ink  #Esto no deberia imprimirlo

Espero su ayuda, muchisimas gracas.
  #2 (permalink)  
Antiguo 18/03/2013, 19:40
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: Problema al parsear un archivo

Hola! no revise el programa(el sueño me esta ganando) pero por el ejemplo de salida que das, no intentaste usar la funcion strtok??? En tu caso el delimitador seria el espacio

Saludos

PD: con mas tiempo reviso el codigo

Etiquetas: int, parsear, programa
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 16:02.