PDA

Visualizza la versione completa : [C] Non trovo l'errore nel codice


ChiaraB92
07-06-2013, 14:39
Ciao a tutti :)
Ho scritto questo programma in C che 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.
Non mi da nessun errore di compilazione e neanche di esecuzione però non produce il risultato desiderato, perchè? Non riesco a trovare l'errore.

Questo è il codice del programma:



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

//Funzione per gestire gli errori
void printerror(char *str, int n)
{
fprintf(stderr, "Errore %d: %s\n", n, str);
exit(n);
}

//Funzione che trova la parola che gli passo in fileIn e scrive in fileOut
void trovaParola(char *parola, FILE *fileOut, FILE *fileIn)
{
char t[100];
char *riga;
int priga; //priga è il contatore delle righe
char *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);
}

priga=1;
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(fprintf(fileOut, "%d\n", priga) == EOF){ //scrivo il numero della riga nel file di output
printerror("Errore nella scrittura della riga nel secondo file.", 3);
}
}
riga = fgets(t, 100, fileIn); //vado alla riga successiva
priga++; //incremento il contatore
}
}

//Funzione che conta le righe in fileIn e cioè le parole chiave
int contaRighe(FILE *fileIn)
{
int righe=0, i;
i = fgetc(fileIn);
while (i != EOF){
if (i == '\n'){
righe++;
}
i = fgetc(fileIn);
}
return righe;
}


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_t = fopen(argv[1],"r");
if (fin_t == NULL){
printerror("Errore nell’apertura del primo file.\n", 2);
}

fin_p = fopen(argv[2],"r");
if (fin_p == NULL){
printerror("Errore nell’apertura del secondo 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
}

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 ;
}
}


Esempi dei file che passo come parametri:
-parole_chiave.txt

testo
programma
parole
file

-testo.txt

Questo è il testo dove il programma
deve cercare le parole chiave
che sono scritte nel file
e scrivere il risultato nel file ris.txt

-il risultato corretto che deve scrivere nel file ris.txt è:

testo
1
programma
1
parole
2
file
3
4


grazie mille e tutti! :)

oregon
07-06-2013, 14:59
Quando leggi con la fgets devi considerare che viene aggiunto un caratter 0x0A alla fine della stringa letta. Quindi, quando confronti la parola letta, non verrà mai trovata nel testo a meno che non sia alla fine.

Per rimediare devi togliere questo carattere dalla fine della stringa (subito dopo ogni fgets) in questo modo

if(parola && parola[strlen(parola)-1]==10) parola[strlen(parola)-1]=0;

ChiaraB92
07-06-2013, 16:04
Non ho capito perchè ==10

oregon
07-06-2013, 16:54
Originariamente inviato da ChiaraB92
Non ho capito perchè ==10

Come ti ho scritto prima

viene aggiunto un carattere 0x0A ...


P.S. Vedo comunque che ti hanno già chiarito in

http://www.pierotofy.it/pages/extras/forum/87/1047145-programma_c_non_trovo_lerrore/

Tieni presente che la sostituzione come ti è stata proposta senza alcun controllo, può fare andare in errore il programma ... usa la if come ti ho suggerito ...

MItaly
07-06-2013, 18:29
(tra parentesi, giusto per portabilità e per maggiore leggibilità invece di fare il confronto con 10 o 0xA metterei '\n' - così è immediatamente chiaro che vuoi rimuovere il newline finale)

ChiaraB92
08-06-2013, 16:04
Va bene, grazie mille!

Loading