如何删除文本文件中的某一行?

时间:2010-12-04 11:54:28

标签: c text-files filehandle

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

我打算使用:

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

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

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

  4. 我是否拥有正确的逻辑......或者您可以建议更好的解决方案...... 希望你能帮助我理解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();
    }
    

1 个答案:

答案 0 :(得分:1)

嗯,磁盘空间允许,我会做以下事情:

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

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

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