Ciao a tutti!
Avevo già chiesto aiuto per questo programma e avevo risolto solo che l'ho dovuto modificare per utilizzare una libreria statica e deve essere compilato tramite Makefile.
Il programma deve stampare una lista di tutte le parole chiave (che trova nel file che gli passo come secondo parametro) che trova nel testo (che è il file che gli passo come primo parametro) sul file che gli passo come terzo parametro con il numero delle righe in cui compaiono.
Questo è il codice del file .h:
codice:#include <stdio.h> #include <stdlib.h> #include <string.h> void printerror(char *str, int n); void trovaParola(char *parola, FILE *fileOut, FILE *fileIn); int contaRighe(FILE *fileIn);
Questo è il codice del file .c dove specifico il codice di tutte le funzioni:
Questo è il codice del programma principale:codice:#include "progetto.h" void printerror(char *str, int n) { fprintf(stderr, "Errore %d: %s\n", n, str); exit(n); } void trovaParola(char *parola, FILE *fileOut, FILE *fileIn) { char t[100]; char *riga; int priga=1; //priga è il contatore delle righe int p; riga = fgets(t, 100, fileIn); // leggo la prima riga del file // Scrivo la parola chiave nel file di output if(fputs(parola, fileOut) == EOF){ printerror("Errore nella scrittura della parola nel secondo file.", 3); } while (riga != NULL){ //fino alla fine del testo p = strstr(riga, parola); //guardo se la parola chiave è presente nella riga if (p != NULL){ // p=NULL se non ha trovato la parola nella riga if(fputs(priga, fileOut) == EOF){ //scrivo il numero della riga nel file di output printerror("Errore nella scrittura della parola nel secondo file.", 3); } } riga = fgets(t, 100, fileIn); //vado alla riga successiva priga++; //incremento il contatore } } int contaRighe(FILE *fileIn) { int righe=0, i; i = fgetc(fileIn); while (i != EOF){ if (i == '\n'){ righe++; } i = fgetc(fileIn); } return righe; }
codice:#include <stdio.h> #include <stdlib.h> #include <string.h> #include "progetto.h" int main(int argc, char *argv[]) { FILE *fin_t; FILE *fin_p; FILE *fout; char p[20]; char *parola; int r, i; int chiudit, chiudip, chiudio; if (argc != 4){ printerror("Specificare tre file come argomenti.\n", 1); } fin_p = fopen(argv[1],"r"); if (fin_p == NULL){ printerror("Errore nell’apertura del secondo file.\n", 2); } fin_t = fopen(argv[2],"r"); if (fin_t == NULL){ printerror("Errore nell’apertura del primo file.\n", 2); } fout = fopen(argv[3],"w"); if (fout == NULL){ printerror("Errore nell’apertura del terzo file.\n", 2); } r = contaRighe(fin_p); //guardo quante parole chiave ho rewind(fin_p); //rimetto il puntatore all'inizio del file parola = fgets(p, 20, fin_p); for(i=0; i<r; i++){ //per quante volte sono le parole chiave trovaParola(parola, fout, fin_t); //eseguo la funzione trovaParola() parola = fgets(p, 20, fin_p); //vado alla parola successiva rewind(fin_t); //rimetto il puntatore all'inizio del file in modo da passarlo tutto ogni volta } //printf("Le parole chiave sono: %d\n",r); chiudit = fclose(fin_t); if(chiudit == 0){ printf("Chiusura del primo file corretta.\n"); }else{ printf("Errore nella chiusura del primo file.\n"); return ; } chiudip = fclose(fin_p); if(chiudip == 0){ printf("Chiusura del primo file corretta.\n"); }else{ printf("Errore nella chiusura del primo file.\n"); return ; } chiudio = fclose(fout); if(chiudio == 0){ printf("Chiusura del secondo file corretta.\n"); }else{ printf("Errore nella chiusura del secondo file.\n"); return ; } }
E questo è il codice del Makefile:
Quando compilo con il comando make non mi da nessun errore ma poi quando esegue il programma mi da errore di segmentazione e non capisco perchè visto che il programma, senza l'uso delle librerie, funziona correttamente.codice:progetto: progetto.o libprog.a gcc -o progetto progetto.o -L. -lprog %.o : %.c gcc -o $@ -c $< libprog.a: prog.o ar r libprog.a prog.o clean: rm *.o progetto *.a prog.o: progetto.h progetto.o: progetto.h
Grazie mille in anticipo![]()


Rispondi quotando