gpt4 book ai didi

c - 为什么我使用 fputc 编写的文件不会终止?

转载 作者:太空宇宙 更新时间:2023-11-04 08:37:09 27 4
gpt4 key购买 nike

我 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com