【问题标题】:How to delete a certain line in a text file?如何删除文本文件中的某一行?
【发布时间】:2010-12-04 11:54:28
【问题描述】:

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

我打算使用:

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

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

  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();
}

【问题讨论】:

    标签: c text-files filehandle


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 哦..感谢您告诉我这种可能性...我会按照您的建议再次感谢:)
    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 2013-12-20
    • 2022-01-27
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多