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

时间:2015-09-17 22:20:17

标签: c++ c pointers for-loop fgetc

我试图理解一些基本代码,并且通过以下代码轻微搞糊涂

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)定义的,据我所知,它只是下一个字符?

2 个答案:

答案 0 :(得分:4)

鉴于编写此特定代码的确切方式,c不需要是int类型 - 如果c的类型为{{1},它仍然可以工作}}

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

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

char

我想有些人可能会觉得这个过分简洁。其他人可能会反对循环条件内的赋值。至少我认为这些是合理而有效的论据,但这仍然适合于图书馆的设计,这是更好的选择。

答案 1 :(得分:1)

fgetc

的签名
  

int fgetc(FILE * stream);

fgetc

return
  
    

成功时,返回字符读取(提升为int值)。     返回类型为int以容纳特殊值EOF,表示失败。

  

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

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