【发布时间】:2015-12-15 19:34:53
【问题描述】:
我需要从标准输入读取一个字符串,然后删除文件中该字符串的所有出现。我必须覆盖原始文件。下面我发布我到目前为止的源代码。它的问题是我不知道应该为while 循环添加什么停止条件,以及如何覆盖原始文件? (如您所见,我尝试将所有不等于给定字符串的单词添加到单独的文件中)。
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp, *fp_out;
char s[50], del[50];
fp = fopen("file_in", "r");
fp_out = fopen("file_out", "a");
fgets(del, 50, stdin);
fgets(s, 50, (FILE *)fp);
while(s != EOF) //I know that this does not work, what condition should I add?
{
fgets(s, 50, (FILE *)fp);
if(strcmp(s, del) != 0)
fprintf(fp_out, "%s ", s);
}
fclose(fp);
fclose(fp_out);
return 0;
}
我提到我也尝试添加while(s != NULL),但这会创建一个 592 MB 的文本文件,其中包含我输入文本文件中的所有单词。
【问题讨论】:
-
您不会覆盖原始文件,因为您会在尝试读取它的同时杀死它。您创建一个新的临时文件,将您的复制/过滤到该临时文件中。然后你删除原始文件并重命名临时文件。
-
你想要的循环是这样的:
while (fgets(s, 50, fp))。要了解原因,请查看fgets return value。另外,在fp上搭便车。它已经是FILE *,所以没有理由投射它。 -
您正在丢弃输入文件的第一行,这意味着您在读取第二行之前不处理它。
-
如果要删除的词是“abca”,文件是“abcabca”,应该保留什么? “bca”还是“”?
-
...或“abc”应该保留吗?