Извлечение строк из XML-файла и вставка их в текстовый файл - PullRequest
0 голосов
/ 16 октября 2010

Я пытаюсь извлечь данные из файла xml, избавиться от тегов xml и сохранить значения в текстовом файле (формат с разделителями табуляции), используя C. Мне удалось извлечь и изменить строку, но я не могу вставить строку в текстовый файл в формате с разделителями табуляции. Вместо того, чтобы получить текстовый файл, который должен выглядеть следующим образом:

x.xxxxxxx        x.xxxxxxxx    x.xxxxxxxx

Я получаю файл, который выглядит как

x.xxxxxxx

      x.xxxxxxx
      x.xxxxxxx

Я думаю, что это происходит из-за того, как я манипулирую строкой из формата x.xxxxxxx в формат x.xxxxxxx. Как новичок, я не совсем уверен, как обойти эту проблему. Что я могу сделать, чтобы это исправить?

Заранее спасибо.

#include <string.h>
#include <stdio.h>
#include <stddef.h>

#define MAX 10000

int main (int argc, char *argv[]){
    FILE *fp;
    char str[MAX];
    char *c[MAX];

    char *xcoor[MAX];
    char *ycoor[MAX];
    char *zcoor[MAX];
    char *z;
    int i =0;

    if((fp = fopen("550.txt", "r"))==NULL){
        printf("Cannot open file.\n");
        exit(1);
    }

    while(!feof(fp)) {
        while(fgets(str, sizeof str, fp)) {
            *(c+i)=strdup(str);
            i++;
        }
    }
    fclose(fp);
    int a = 0;

    for(i=5;i<1700;i=i+17){
        xcoor[a]=c[i];
        a++;
    }

    int b = 0;
    for(i=6;i<1700;i=i+17){
        ycoor[b]=c[i];
        b++;
    }

    char letterx = 'x';
    char lettery = 'y';
    char arrow1 = '<';
    char arrow2 = '>';
    char slash = '/';

    for (i=0;i<100;i++){
        z = *(xcoor+i);
        int g = 0;
        for(g;g<strlen(z);g++){
            if(z[g] == letterx)
            strcpy(z+g, z+g+1);
        }
        *(xcoor+i)=z;        
    }

    for (i=0;i<100;i++){
        z = *(xcoor+i);
        int g = 0;
        for(g;g<strlen(z);g++){
            if(z[g] == arrow1)
            strcpy(z+g, z+g+1);
        }
        *(xcoor+i)=z;    
    }

    for (i=0;i<100;i++){
        z = *(xcoor+i);
        int g = 0;
        for(g;g<strlen(z);g++){
            if(z[g] == arrow2)
            strcpy(z+g, z+g+1);
        }
        *(xcoor+i)=z;        
    }

    for (i=0;i<100;i++){
        z = *(xcoor+i);
        int g = 0;
        for(g;g<strlen(z);g++){
            if(z[g] == slash)
            strcpy(z+g, z+g+1);
         }
        *(xcoor+i)=z; 
    }

    for (i=0;i<100;i++){
        z = *(ycoor+i);
        int g = 0;
        for(g;g<strlen(z);g++){
            if(z[g] == lettery)
                strcpy(z+g, z+g+1);
        }
        *(ycoor+i)=z;        
    }

    for (i=0;i<100;i++){
        z = *(ycoor+i);
        int g = 0;
        for(g;g<strlen(z);g++){
            if(z[g] == arrow1)
                strcpy(z+g, z+g+1);
        }
        *(ycoor+i)=z;    
    }

    for (i=0;i<100;i++){
        z = *(ycoor+i);
        int g = 0;
         for(g;g<strlen(z);g++){
            if(z[g] == arrow2)
                strcpy(z+g, z+g+1);
        }
        *(ycoor+i)=z;        
    }

    for (i=0;i<100;i++){
        z = *(ycoor+i);
        int g = 0;
        for(g;g<strlen(z);g++){
            if(z[g] == slash)
                strcpy(z+g, z+g+1);
        }
        *(ycoor+i)=z;        
    }

    FILE *agentfile;
    agentfile = fopen("name.txt", "w");
    for(i=0;i<100;i++){
        fprintf(agentfile, "%s    %s", *(xcoor+i),    *(ycoor+i));
    }
    fclose(agentfile);
    printf("I'm happy that the program ended fine");

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 17 октября 2010

fgets возвращает большинство '\ n', вы должны удалить это:

while(!feof(fp)) {
    while(fgets(str, sizeof str, fp)) {
        *(c+i)=strdup(str);
        i++;
    }
}

лучше:

while( fgets(str, sizeof str, fp) ) {
  if( strchr(str,'\n') )
     *strchr(str,'\n')=0;
  *(c+i)=strdup(str);
  i++;
}

strdup не является ANSI C.

0 голосов
/ 17 октября 2010

Вы просто фильтруете теги, а не лишние переводы строк, возврат каретки.Проблема с вашей логикой.

Вот что вы можете сделать: взять данные, которые находятся только внутри тегов, игнорировать что-либо снаружи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...