Oppure

Loading
07/06/13 6:55
ChiaraB92
Ho scritto questo programma in C. 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 ;
}
}
aaa
07/06/13 12:22
ZioCrocifisso
Quando viene letta la stringa, questa contiene un newline finale, dunque il programma rileva le parole chiave solo se si trovano alla fine della riga, visto che solo lì c'è un newline. Per sistemare ciò basta aggiungere:
parola[strlen(parola) - 1] = 'Quando viene letta la stringa, questa contiene un newline finale, dunque il programma rileva le parole chiave solo se si trovano alla fine della riga, visto che solo lì c'è un newline. Per sistemare ciò basta aggiungere:

parola[strlen(parola) - 1] = '{parsed_message}';

Dopo aver scritto la parola nel file (dopo la riga 24), in modo da rimuovere il newline finale solo dopo aver scritto la parola nel file (altrimenti vengono tutte unite).';

Dopo aver scritto la parola nel file (dopo la riga 24), in modo da rimuovere il newline finale solo dopo aver scritto la parola nel file (altrimenti vengono tutte unite).
Ultima modifica effettuata da ZioCrocifisso 07/06/13 12:23
aaa
07/06/13 13:10
ChiaraB92
Grazie mille! :) :)
aaa