PDA

Visualizza la versione completa : [C] Estrazione di un lemma specifico da file di testo


hurricane86
19-01-2007, 20:00
Ecco qui i due metodi indagati:

In poche parole il primo metodo estrare le righe da un file txt in cui compare in lemma passato e le passa al secondo metodo che filtra le parole...La cosa strana è che funziona , per le prime righe, poi lancia un'eccezzione...dalle prove il problema è la malloc nel secondo metodo...ma perchè a volte funge e a volte no?



/* Metodo che rimuove dal file in input tutte le righe in cui compare il lemma passato */
void delete_lemma_all(FILE *stream, char *lemma){
FILE *tmp;
tmp = fopen("./file_tmp.txt", "w+");
char linea[512];
int row=0;
while(fgets(linea,512,stream) != NULL ){
if(strstr(linea, lemma) == NULL) { fprintf(tmp,"%s",linea); }
else {printf("%s\n",linea); delete_lemma_all_2(linea, row);}
row++;
}
fclose(tmp);
fclose(stream);
remove("./file.txt");
rename("./file_tmp.txt","./file.txt");
stream = fopen("./file.txt", "r+");
}

/* Metodo che estrae dalla stringa passate tutti lemmi, in modo da aggiornare il database */
void delete_lemma_all_2(char *linea, int row){
int len = strlen(linea);
char ch;
char *lemma = NULL;
int i=0;
int k=0;
lemma = (char*)malloc(sizeof(char)); /* DOPO UN PO SI IMPIANTA IN STA MALLOC!!! COME MAI? */
if (lemma == NULL) {
printf("Errore nell'allocazione di memoria\n");
exit (1);
}
printf("Lunghezza linea: %d\n",len);
/*while( (ch = linea[k]) != '\0' ){*/
while(k<len){
ch = linea[k];
if((((int)ch>64)&&((int)ch<91))||(((int)ch>96)&&((int)ch<123))){
lemma = (char*)realloc(lemma,(i+1)*sizeof(char));
if (lemma == NULL) {
printf("Errore nell'allocazione di memoria\n");
exit (1);
}
lemma[i]=ch;
i++;
}else{
lemma[i]='\0';
if ((i>3)&&(i<MAX_LEMMA)) printf("->%s\n",lemma);
i=0;
free(lemma);
}
k++;
}
lemma[i]='\0';
if ((i>3)&&(i<MAX_LEMMA)) printf("%s\n",lemma);
free(lemma);
}


grazie mille, sono giorni che ci sto sbattendo la testa senza cavarci niente!

oregon
19-01-2007, 20:06
Mostra anche i dati su cui operi ... e' su quelli che va provato il codice per individuare piu' facilmente e velocemente il problema ...

hurricane86
19-01-2007, 20:33
un semplice txt:



prova come mai non va un belino
prova come mai non va un belino
prova come mai non va un belino
prova come mai non va un belino
prova come mai non va un belino
prova come mai non va un belino
prova come mai non va un belino
prova come mai non va un belino

oregon
19-01-2007, 20:48
Il problema e' che, nel ciclo, esegui la realloc dopo che hai eseguito la free ...

hurricane86
19-01-2007, 20:52
Originariamente inviato da oregon
Il problema e' che, nel ciclo, esegui la realloc dopo che hai eseguito la free ...

ok ora provo a fare una malloc subito dopo la free


grandissimo! ora va alla perfezione! e pensare che erano giorni che le provavo tutte

alka
20-01-2007, 19:27
Suggerisco come sempre di usare titoli significativi e, soprattutto, di indicare il linguaggio, come da Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887).

Loading