我 3 天前才开始学习 C,我正在尝试编写一个程序,它接收一个文件、读取字符并从中删除所有空格和制表符。我是一名初级程序员,在开始学习 C 之前只学习了一点 MATLAB。我使用的是 Ubuntu 12.04。
这是我的代码:
#include <stdio.h>
int main ()
{
FILE * pFile;
FILE * pFile2;
int c;
pFile = fopen ("spaces.txt","r");
pFile2 = fopen ("nospaces.txt","w");
if (pFile==NULL) perror ("Error opening file");
else
{
while (c != EOF)
{
c = fgetc (pFile);
if (!(c == ' ' || c == ' '))
{
fputc (c, pFile2);
}
}
fclose (pFile2);
fclose (pFile);
}
return 0;
}
当我打开新文件“nospaces.txt”时,一切正常,除了末尾有一个奇怪的字符。 Gedit 说它是红色背景的/FF 或/00,并提示我不应该编辑该文件,因为我可能会破坏它。不管我怎么努力,最后都无法摆脱那个奇怪的角色。以下是我尝试过的示例:
- 使用 fputc (EOF , pFile2) 将 EOF、'\0' 和其他随机字符添加到 pFile2 的末尾 - 对 c 的值进行随机约束,这样它就不会选择不是字母或数字的字符(比如 40 < c < 125) -让它成为 while 而不是 while 循环(我不知道有什么区别)
请帮忙。 谢谢。
最佳答案
你的读取循环是错误的。你读了一个字太多了。
while (c != EOF)
{
c = fgetc (pFile);
if (!(c == ' ' || c == \t)) {
fputc (c, pFile2);
}
}
那是说:“虽然 c
不等于文件结尾值,再读一个字符并写入”好吧,再多一个字符是 EOF
。您需要在检查之前提取字符:
while ((c = fgetc(pFile)) != EOF)
{
if (c != ' ' && c != \t) {
fputc (c, pFile2);
}
}
旁注,c
在您第一次阅读它之前是未初始化的,这会调用未定义的行为,因为它的值是不确定的。新版本也解决了这个问题。
关于c - 为什么我使用 fputc 编写的文件不会终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25736239/