PDA

Visualizza la versione completa : Controllare se una stringa e' presente in un file ed eliminarla eventualmente C


Lucat95
07-12-2018, 13:36
Salve, mi servirebbe una funzione C che legga da un file linea per linea e, se trova una corrispondenza con un char * passato come parametro la elimina dal file.

La mia idea era quella di usare un file di appoggio e proseguire in questo modo:
leggo una riga del file, se e' diversa dalla stringa passata come argomento non la copio nel file di appoggio, altrimenti si.
Quando ho finito il file, rinomino il file di appoggio col nome del file "originale".

Vi posto il codice:

void delete_from_file(FILE *f, char *filename)/** Cancella ogni riga uguale a filename dal file.*/
{
printf("in delete from file\n");
FILE *copy = fopen("copy.txt", "w+");
if(copy == NULL)
err_func("Errore in fopen()\n");
while(1){
char *buffer = NULL;
size_t len;
ssize_t read;
read = getline(&buffer, &len, f);
if(read == -1 && feof(f) == 0)
err_func("Errore getline()\n");
if(strcmp(buffer, filename) != 0){
printf("nella delete from buffer = %s e filename = %s\n", buffer, filename);
if((unsigned int)fprintf(copy,"%s", buffer) != strlen(buffer))
err_func("Errore in fprintf()\n");
}
if(read == -1 && feof(f) != 0)
break;
free(buffer);
}
if(rename("copy.txt", "files_dirty.txt") != 0)
err_func("Errore in rename()\n");
if(fclose(copy) != 0)
err_func("Errore in fclose()\n");
}
("files_dirty.txt" e' il nome del file originale).

Le righe sono inserite in questo file in questo modo:

if((unsigned int)fprintf(f, "%s\n", filename) != strlen(filename)+1)
err_func("Errore in fprintf()\n");

In pratica quello che devo fare e' tenere una lista di nomi di file su un file di testo e all'occorrenza devo anche poterli rimuovere.
Il problema e' che eseguendo il codice non riesco a far combaciare la stringa ottenuta con getline() con quella passata come argomento... infatti eseguendo ottengo una roba del tipo


in delete from file
nella delete from buffer = iliade.txt
e filename = iliade.txt
nella delete from buffer = e filename = iliade.txt

Quello che devo fare e' porre nel file il nome "iliade.txt" (per esempio) e dopo aver fatto alcune cose devo togliere tale nome dal file.

Spero qualcuno possa aiutarmi, so che non e' complicato ma non riesco a venirne a capo "con criterio" e procedere a tentativi non mi pare il caso.

Grazie

oregon
08-12-2018, 17:31
La getline una tua funzione?

Loading