Gestione file in C – Rimozione di parole specifiche da un elenco nel file di testo

Sto compilando un breve dizionario dal mio programma base C usando il seguente codice:

void main () { FILE *fp; fp = fopen("c:\\CTEMP\\Dictionary2.txt", "w+"); fprintf(fp, Word to Dictionary"); 

Tuttavia vorrei anche rimuovere alcune parole che non desidero più essere nel dizionario. Ho fatto delle ricerche e lo so

“Non è ansible rimuovere il contenuto da un file e spostare il contenuto rimanente verso il basso. È ansible solo aggiungere, troncare o sovrascrivere.

L’opzione migliore è leggere il file nella memoria, elaborarlo in memoria e poi riscriverlo sul disco ”

Come posso creare un nuovo file senza la parola che voglio rimuovere?

Grazie

  • Apri due file: quello che hai (per leggere) e uno nuovo (per scrivere).
  • Si scorre il primo file leggendo ogni riga a turno.
  • Si confronta il contenuto di ogni riga con le parole che è necessario eliminare.
  • Se la riga non corrisponde a nessuna delle parole di eliminazione, la scriverà nel nuovo file.

Se la manipolazione che devi fare è molto più complessa, puoi letteralmente “leggerla in memoria” usando mmap (), ma questa è una tecnica più avanzata; è necessario trattare il file come un array di byte senza terminatore zero e ci sono molti modi per rovinarlo.

Ho usato il seguente codice:

 printf("Enter file name: "); scanf("%s", filename); //open file in read mode fileptr1 = fopen("c:\\CTEMP\\Dictionary.txt", "r"); ch = getc(fileptr1); while (ch != EOF) { printf("%c", ch); ch = getc(fileptr1); } //rewind rewind(fileptr1); printf(" \n Enter line number of the line to be deleted:"); scanf("%d", &delete_line); //open new file in write mode fileptr2 = fopen("replica.c", "w"); ch = getc(fileptr1); while (ch != EOF) { ch = getc(fileptr1); if (ch == '\n') { temp++; } //except the line to be deleted if (temp != delete_line) { //copy all lines in file replica.c putc(ch, fileptr2); } } fclose(fileptr1); fclose(fileptr2); remove("c:\\CTEMP\\Dictionary.txt"); //rename the file replica.c to original name rename("replica.c", "c:\\CTEMP\\Dictionary.txt"); printf("\n The contents of file after being modified are as follows:\n"); fileptr1 = fopen("c:\\CTEMP\\Dictionary.txt", "r"); ch = getc(fileptr1); while (ch != EOF) { printf("%c", ch); ch = getc(fileptr1); } fclose(fileptr1); scanf_s("%d"); return 0; }