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

标签 c file char eof

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

相关文章:

c - 为二维字符数组动态分配内存

c - 32位和4GB内存有什么关系?

python - 从文件中的数据组成的列表中删除字符

从输入文件创建 3D 阵列?

c - 在c中声明空字符串变量

c - 赋值中的类型不兼容,为什么我不能这样做?

c - printf ("%-10s") 在系统区域设置中工作错误

c - openmp 比一个线程慢,无法弄清楚

java - 如何减少 Java 中 ImageIcon 双数组的执行时间

c - 将 int 存储在 2 个字符中