0

你能帮我编写一个删除文本文件中某一行的程序吗?

我打算使用:

  1. fgets 从文本文件中捕获一行并将其存储在一个数组中,但我很困惑 fgets 如何将该行存储在一个数组中(它是否捕获该行并将其存储在第一个索引中,并且下次它捕获一行时会这将存储到下一个索引还是只覆盖数组的第一个索引?)

  2. 如果该行存储在不同的索引中,我将有一个条件,将用户的输入与捕获的 fgets 行进行比较,如果相等,它将跳过该行并执行规则,直到它到达文件末尾。

  3. 然后我会像这样关闭 fclose(stream) 文本文件并将其重新打开为“wt”以覆盖文件中写入的所有内容。

我的逻辑是否正确...或者您可以提出更好的解决方案...希望您能帮助我了解 fgets 如何将行存储在数组中...

顺便说一句,这是我正在尝试进行测试的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct studentinfo{
       char id[8];
       char name[30];
       char course[5];
}s1;
int main(void){
     FILE *stream = NULL;
     stream = fopen("studentinfo.txt", "rt");

     char arr[100];
     int i=0;

    while(!feof(stream)){  
     fgets(arr, 100, stream);
     printf("%s", arr);
     }
     fclose(stream);
/*planning to reopen the stream but will change "rt" to "wt"*/

     getch();
}
4

1 回答 1

1

好吧,如果磁盘空间允许,我会执行以下操作:

  • 打开输入文件进行读取
  • 打开一个临时文件(在同一目录中)进行写入
  • 而不是在输入文件的末尾:
    • 从输入文件中读取行
    • 如果它不等于您要查找的行,请将其写入输出文件
  • 关闭两个文件
  • 删除输入文件
  • 重命名临时文件以为其提供输入文件的名称

这避免了将(几乎)整个文件保存在内存中的需要。

它也不会遇到这样的问题:如果您的程序在编写文件的过程中死掉(或被杀死),您的输入文件的一部分可能会永远丢失。

于 2010-12-04T11:59:13.793 回答