Fare il parse di un file

di il
5 risposte

Fare il parse di un file

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?

5 Risposte

  • Re: Fare il parse di un file

    Per prima cosa devi capire se stai leggendo correttamente il file, per cui ti consiglio di commentare temporaneamente il for che cicla sulla stringa e limitarti a fare un printf() di line.
  • Re: Fare il parse di un file

    Per quello che devi fare scanf è particolarmente comoda secondo me!

    guarda:
    
    #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,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);
       }
    	char buffer[256]; 
    	char *riga;	
    	char var[256];
    	while(!(feof(fp))){ //fino alla fine del file
    		riga=fgets(buffer,256,fp); //fgets legge la riga 
    		int count=0;
    		for (i=0;i<4;i++){
    			if (count==0){
    				fscanf(fp,"%s",mod);
    				count++;
    			}
    			if (count==1){
    				fscanf(fp,"%s",size);
    				count++;
    			}
    			if (count==2){
    				fscanf(fp,"%s",nused);
    				count++;
    			}
    			if (count==3){
    				fscanf(fp,"%s",usedby);
    				count++;
    			}
    	
    		}
    		 printf("Module : %s\nSize : %s\nUsed by : %s processes:\n\n",mod,size,nused,usedby);
    		
    	}
       fclose(fp);
       return 0;
    }
    
    se hai dubbi scrivi pure!
  • Re: Fare il parse di un file

    Caro aguero93, io credo che tu stia solo confondendo le idee a shane007.
    Gli suggerisci di usare scanf() e poi nell'esempio usi fscanf(); poi nell'esempio introduci fgets() che con le successive fscanf() non ti farà altro che saltare delle righe (tanto più che buffer[] per cosa lo leggi se poi non lo usi?)...
  • Re: Fare il parse di un file

    Grazie lo stesso, problema risolto usando strtok
  • Re: Fare il parse di un file

    candaluar ha scritto:


    Caro aguero93, io credo che tu stia solo confondendo le idee a shane007.
    Gli suggerisci di usare scanf() e poi nell'esempio usi fscanf(); poi nell'esempio introduci fgets() che con le successive fscanf() non ti farà altro che saltare delle righe (tanto più che buffer[] per cosa lo leggi se poi non lo usi?)...
    hai ragione ho diciamo mischiato due idee...

    in realtà volevo fare una cosa del genere:
    
    #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,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);
       }
    	int count;
    	char buffer[256]; 	
    	while(1){ // condizione per interrompere il ciclo al break
    		count=0;
    		i=0;
    		for (i;i<4;i++){
    			if (count==0){
    				fscanf(fp,"%s",mod);
    				count++;
    			}
    			if (count==1){
    				fscanf(fp,"%s",size);
    				count++;
    			}
    			if (count==2){
    				fscanf(fp,"%s",nused);
    				count++;
    			}
    			if (count==3){
    				fscanf(fp,"%s",usedby);
    				count++;
    			}
    	
    		}
    		fscanf(fp,"%s",buffer);	// serve solo per mandare avanti il puntatore al file
    		fscanf(fp,"%s",buffer);	// serve solo per mandare avanti il puntatore al file
    		
    		if (feof(fp)==1){
    			break;
    		}
    		 printf("Module : %s\nSize : %s\nUsed by : %s\nprocesses: %s \n\n",mod,size,nused,usedby);
    		
    	}
    
        
       fclose(fp);
       return 0;
    }
    
    ma non era molto "elegante" come soluzione. Comunque l'importante è che ha risolto
Devi accedere o registrarti per scrivere nel forum
5 risposte