2017-01-09 4 views
1

Я заселение краткий словарь из моей основной программы C, используя следующий код:Обработка файлов в C - Удаление конкретных слов из списка в текстовом файле

void main() { 

FILE *fp; 

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

fprintf(fp, Word to Dictionary"); 

Однако я хотел бы также, чтобы удалить определенные слова, которые Я больше не хочу быть в словаре. Я сделал некоторые исследования, и я знаю, что

"Вы не можете удалять содержимое из файла и имеют остаточное содержание сдвинуты вниз. Вы можете только добавить, укоротить или перезаписать.

Ваш лучший вариант, чтобы прочитать файл в память, обработать его в памяти, а затем записать его на диск «

Как создать новый файл без слова, которое я хочу удалить?

Благодаря

+1

Прочитайте исходный файл слово за словом, для каждого слова, которое вы хотите, записать его на выходе. –

+3

«Ваш лучший вариант - прочитать файл в памяти, обработать его в памяти, а затем записать его на диск». Часть «процесс» просто не записывает данные, которые вы не хотите в файле. –

+0

@ Jean-BaptisteYunès и @ Some programmer dude Спасибо за ваш вклад. –

ответ

4
  • Вы открыть два файла: один у вас есть (для чтения) и новый (для письма).
  • Вы прокручиваете первый файл, просматривая каждую строку по очереди.
  • Вы сравниваете содержимое каждой строки со словами, необходимыми для удаления .
  • Если строка не соответствует ни одному из слов удаления, то вы пишете ее в новый файл.

Если манипуляция, которую вам нужно сделать, намного сложнее, вы можете буквально «прочитать ее в памяти» с помощью mmap(), но это более совершенная техника; вам нужно обработать файл как массив байтов без нулевого терминатора, и есть много способов испортить это.

+0

Спасибо @Richard Urwin за ваш вклад. Мои манипуляции не так сложны, поэтому я пойду или ваш первый метод. –

+2

Когда вы закончите, вы получите два файла: старый и новый. Вы можете захотеть заменить старый на новый, и есть шаблон, чтобы сделать то, что не очевидно: после закрытия обоих файлов сначала переименуйте старый файл. Затем переименуйте новый файл в исходное имя, а затем удалите старый файл. Если вы этого не сделаете, и есть проблема, вы можете потерять все свои данные. –

+0

Привет, Ричард, не возражаете, если я задал вам пару вопросов о том, что вы только что сказали выше, в чате? –

0

Я использовал следующий код:

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; 

    }