我们经常这样使用fgetc
:
int c;
while ((c = fgetc(file)) != EOF)
{
// do stuff
}
从理论上讲,如果文件中的一个字节具有
EOF
的值,则此代码有错误-将尽早中断循环并无法处理整个文件。这种情况可能吗?据我了解,
fgetc
在内部将从文件读取的字节转换为unsigned char
,然后转换为int
,并将其返回。如果int
的范围大于unsigned char
的范围,这将起作用。如果不是(可能是
sizeof(int)=1
),会发生什么?fgetc
会从文件中读取与EOF
相等的合法数据吗? EOF
? fgetc
是未实现的功能吗? EOF
是否会是long
之类的另一种类型? 我可以通过额外的检查使代码变得万无一失:
int c;
for (;;)
{
c = fgetc(file);
if (feof(file))
break;
// do stuff
}
是否需要最大的便携性?
最佳答案
是的,c = fgetc(file); if (feof(file))
确实可以实现最大的可移植性。它通常适用于unsigned char
和int
具有相同数量的唯一值的情况。这在char
,signed char
,unsigned char
,short
,unsigned short
,int
和unsigned
的罕见平台上都使用相同的位宽和范围宽度。
注意,feof(file))
是不够的。代码还应该检查ferror(file)
。
int c;
for (;;)
{
c = fgetc(file);
if (c == EOF) {
if (feof(file)) break;
if (ferror(file)) break;
}
// do stuff
}
关于c - 使用fgetc时是否可能将EOF与常规字节值混淆?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32641375/