与fgetc()一起使用的整型变量

integer variable used with fgetc()

本文关键字:整型变量 一起 fgetc      更新时间:2023-10-16

我试图理解一些基本的代码,被下面的代码有点困惑

int main ()
{
   FILE *fp;
   int c;
   int n = 0;
   fp = fopen("file.txt","r");
   if (fp == NULL)
   {
      perror("Error in opening file");
      return(-1);
   }
   do
   {
      c = fgetc(fp);
      if ( feof(fp) )
      {
         break ;
      }
      printf("%c", c);
   } while(1);
   fclose(fp);
   return(0);
}

有人能解释一下为什么c是整数类型,即使它是由fgetc(fp)定义的,据我所知,只是下一个字符?

考虑到这段特定代码的精确编写方式,c不需要是int类型——如果cchar类型,它仍然可以工作。

大多数从文件中读取字符的代码应该(至少在最初)将这些字符读入int。具体来说,c风格I/O的部分基本设计是,像getcfgetc这样的函数除了可能来自文件的任何值之外,还可以返回EOF。也就是说,可以从文件中读取类型为char的任何值。getcfgetc等可以通过返回至少一个不会/不能来自文件的值来表示文件结束。通常是-1,但不能保证。当对char进行签名时(现在通常是这样),您可以从文件中获得一个值,当它被分配给char时,该值将显示为-1,因此,如果您依赖返回值来检测EOF,这可能会导致错误检测。

问题中包含的代码只是将文件的内容复制到标准输出,一次一个字符。利用EOF返回值,我们可以稍微简化一下代码,因此主循环看起来像这样:

int c;
while (EOF != (c = fgetc(fp)))
    printf("%c", c); // or: putchar(c);

我想有些人可能会觉得这句话过于简洁。其他人可能反对循环条件内的赋值。至少,我认为这些都是合理和有效的论点,但这仍然足够适合库的设计,因此更可取。

fgetc签名

int fgetc (FILE * stream);

关于fgetc的返回值

如果成功,则返回读取的字符(提升为int值)。返回类型为int,以适应特殊值EOF,该值表示失败。

所以我们声明变量为整型。As字符可以是无符号的,不能取负值。但是EOF的实现总是负的或非常常见的-1,它可以用作失败或文件结束。所以使用整数是安全的,可以像

这样使用
int c;
while ((c = fgetc(fp))!=EOF){
   //Code goes here
}