PDA

Visualizza la versione completa : Fare il parsing di un file


shane007
20-05-2014, 14:32
Ciao a tutti, ho dei problemi nel fare il parse di un file strutturato in questo modo:

Milano 33719 5 - cod 23425334
Firenze 32453 5 - cod 298234234
Bologna 9535 3 via_prati,via_3_novembre,via_travai, cod 2892342
Praga 36439 5 - cod 29834234
Roma 97275 3 via_prati,via_3_novembre,via_travai, cod 289234234


e vorrei leggero per poi stampare a schermo una cosa del genere:






Module: Firenze
Size: 33719
Nused: 5
Usef by: -




Module: Bologna
Size: 33719
Nused: 3
Usef by: via_prati,via_3_novembre,via_travai


ecc...



Il "cod 23425334" non devo stamparo.


Questo il mio codice, ma come potete vedere tutto sfasato:




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


int main(int* argc, char* argv[]){
FILE *fp;
char *line=NULL;
char ch;
char mod[256],size[256],nused[256],usedby[1024];
int i=0,fase=0;
size_t len=0;
ssize_t read;
//fp=fopen("/proc/modules","r");
fp=fopen("texto.txt","r");
if(fp==NULL){
perror("Errore nell' apertura del file.\n");
exit(EXIT_FAILURE);
}
while(read=getline(&line,&len,fp)!=-1){
strcpy(mod,"");
strcpy(size,"");
strcpy(usby,"");
strcpy(car,"");
fase=0;
for(i=0;i<strlen(line);i++){
if(line[i] == '\t'){
fase++;
}
else if(fase==0){
car[0]=line[i];
strcat(mod,car);
}
else if(fase==1){
car[0]=line[i];
strcat(size,car);
}
else if(fase==2){
car[0]=line[i];
strcat(usby,car);
break;
}
else if(fase==3){
car[0]=line[i];
strcat(usedby,car);
break;
}
}
printf("Module : %s\nSize : %s\nUsed by : %s processes:\n\t",mod,size,nused,usedby);
}
fclose(fp);
return 0;
}



Questo l'output SBAGLIATO che mi da:;




Module : Milano 33719 5 - cod 23425334


Size :
Used by : processes:
Module : Firenze 32453 5 - cod 298234234


Size :
Used by : processes:
Module : Bologna 9535 3 via_prati,via_3_novembre,via_travai, cod 2892342


Size :
Used by : processes:
Module : Praga 36439 5 - cod 29834234


Size :
Used by : processes:
Module : Roma 97275 3 via_prati,via_3_novembre,via_travai, cod 289234234
Size :
Used by : processes:


Io non so come risolvere il problema... dove sbaglio? :dh: :dh:

Scara95
20-05-2014, 16:08
Che codice complicato :O

Studiati questo:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define cbreak " \t\r\n"

int main(void) {
FILE *f = stdin;
char *l = NULL;
size_t n = 0;
while((getline(&l, &n, f)) != -1) {
printf("Module: %s\n", strtok(l, cbreak));
printf("Size: %s\n", strtok(NULL, cbreak));
printf("Nused: %s\n", strtok(NULL, cbreak));
printf("Used by: %s\n\n", strtok(NULL, cbreak));
}
free(l);
return EXIT_SUCCESS;
}

Loading