【问题标题】:Detect end of text file, reading using fgetc检测文本文件的结尾,使用 fgetc 读取
【发布时间】:2014-05-07 09:30:17
【问题描述】:

我有一个文本文件。我正在编写一个程序以使用 fgetc 从文件中读取并放入二维缓冲区。

在打印文件的内容后,它会打印一些垃圾,直到缓冲区结束,尽管已经检查了 EOF 和 ERROR,如下所示。我怎样才能完成它?

    unsigned char ch;
    while(ch=fgetc(fp))
    {
       if(ch== EOF || ch==NULL)
       break;
       //OTHER INSTRUCTIONS
    }

谢谢:)

【问题讨论】:

  • 可以尝试将unsigned char 更改为char 吗? EOF 为 -1,因此不能存储在 unsigned 类型中。
  • @rcs fgetc() 的正确返回类型当然是int,关键是该类型需要足够大以容纳每个有效字符, EOF 不是字符。

标签: c file eof


【解决方案1】:

EOF 是一个整数,其值为-1

当您在 while 循环中执行 ch=fgetc(fp) 时,您会读入一个 unsigned char,根据定义,它不能被签名,因此它不能等于 -1

一种解决方案可能是读入一个整数并在检查EOF 后将其强制转换。

int ch;
while(ch=fgetc(fp))
{
   if(ch == EOF)
   break;
   //OTHER INSTRUCTIONS
}

请参阅this 了解如何实施的示例。

【讨论】:

  • 这里不需要检查NULL(虽然应该是0)。变量ch 将是0 仅当它从文件中读取一个,并且OP 保证“我有一个文本文件”。
  • @Jongware 你是对的,我删除了它。我只是从 OP 中获取样本并将 unsigned char 更改为 int ;)
【解决方案2】:

您的程序有一些错误。使用以下程序,打印任何文件的所有数据是正确的程序:

#include<stdio.h>
#include<conio.h>
main()
{
    FILE *fp;
    char c;
    fp=fopen("filename.txt","r");
    clrscr();
    c=fgetc(fp);
    while(c!=EOF)
    {
        printf("%c",c);
        c=fgetc(fp);
    }
    getch();
}

希望对你有所帮助

【讨论】:

  • 在某些平台上使用char c; 会出现问题。始终选择int c,因为fgetc 的返回类型是`int。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2013-07-14
  • 2016-08-13
相关资源
最近更新 更多