与fgetc()一起使用的整型变量
integer variable used with 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)
定义的,据我所知,只是下一个字符?
考虑到这段特定代码的精确编写方式,c
不需要是int
类型——如果c
是char
类型,它仍然可以工作。
大多数从文件中读取字符的代码应该(至少在最初)将这些字符读入int
。具体来说,c风格I/O的部分基本设计是,像getc
和fgetc
这样的函数除了可能来自文件的任何值之外,还可以返回EOF。也就是说,可以从文件中读取类型为char
的任何值。getc
、fgetc
等可以通过返回至少一个不会/不能来自文件的值来表示文件结束。通常是-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
}
相关文章:
- C 字符串返回字符串的整数/双精度/长整型值
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 将长整型值打印为带有前导零的十六进制
- 当我使用长整型时,我的代码不起作用,它与 int 一起工作得很好
- 将字符串中以十六进制形式存储的负长整型值转换为 C++ 中的长整型变量
- 为什么当我们把变量"u"的数据类型从长整型更改为整型时,模幂会出错?
- C++:如何初始化不是整型的静态成员变量
- 整型变量的奇数C/C++初始化语法
- 使用整型变量检查用户输入是整型还是字符串
- 对整型变量的双精度值-意外输出
- 整型变量不能存储大的值
- 与fgetc()一起使用的整型变量
- 如何将整型变量转换为QTime对象
- 在c++中,将整型变量附加到char变量后
- ' ios_base '的标志都是静态const整型变量.为什么可以用' ios_base::setf() '来
- 将地址赋值给整型变量
- 整型变量赋值的差异
- OpenMP - OpenMP 语句中的索引变量'for'必须具有有符号整型