rrz0
rrz0

Reputation: 2302

File Handling in C - Removing specific words from a list in text file

I am populating a short dictionary from my basic C program using the following code :

void main () {

FILE *fp;

fp = fopen("c:\\CTEMP\\Dictionary2.txt", "w+"); 

fprintf(fp, Word to Dictionary");

However I would also wish to remove certain words which I do not longer wish to be in the dictionary. I did some research and I know that

" You can't remove content from a file and have the remaining content shifted down. You can only append, truncate or overwrite.

Your best option is to read the file in to memory, process it in memory and then write it back to disk"

How can I create a new file without the word I want to remove ?

Thanks

Upvotes: 2

Views: 1007

Answers (2)

rrz0
rrz0

Reputation: 2302

I used the following code :

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;

    }

Upvotes: 0

Richard Urwin
Richard Urwin

Reputation: 146

  • You open two files: the one you've got (for reading) and a new one (for writing).
  • You loop through the first file reading each line in turn.
  • You compare the contents of each line with the words you need to delete.
  • If the line does not match any of the deletion words, then you write it to the new file.

If the manipulation that you need to do is much more complex then you can literally "read it into memory" using mmap(), but that is a more advanced technique; you need to treat the file as a byte array with no zero terminator and there are lots of ways to mess that up.

Upvotes: 5

Related Questions