[英]fgetc returns an unknown character
我有以下代码:
FILE *f = fopen('/path/to/some/file', 'rb');
char c;
while((c = fgetc(f)) != EOF)
{
printf("next char: '%c', '%d'", c, c);
}
由于某些原因,在打印字符时,在文件末尾,将打印出不可渲染的字符以及ASCII序数-1。
next char: '?', '-1'
这应该是什么角色? 我知道这不是EOF,因为要进行检查,并且在打印字符后很快就会执行SEGFAULT程序。
麻烦的是fgetc()
及其亲戚返回一个int
,而不是char
:
如果未设置由流指向的输入流的文件结尾指示符,并且存在下一个字符,则
fgetc
函数将获取该字符作为unsigned char
并将其转换为int
并将该流的关联文件位置指示符前进(如果已定义)。如果设置了流的文件结束指示符,或者流在文件末尾,则设置了流的文件结束指示符,并且
fgetc
函数返回EOF
。
它必须返回每个可能的有效字符值和一个不同的值EOF
(为负值,通常但不一定是-1
)。
当您将值读入char
而不是int
,发生以下两种不良情况之一:
如果纯char
是无符号的,则您永远不会获得等于EOF的值,因此循环永远不会终止。
如果对普通char
进行了签名,则可能会误认为一个合法字符,即0xFF(通常是,y-umlaut,U + 00FF,带有DIAERESIS的拉丁文小写字母Y)与EOF相同,因此您会过早检测到EOF。
无论哪种方式,它都不是很好。
解决方法是使用int c;
代替 。 char c;
顺便说一句, fopen()
调用不应编译:
FILE *f = fopen('/path/to/some/file', 'rb');
应该:
FILE *f = fopen("/path/to/some/file", "rb");
始终检查fopen()
的结果; 在所有I / O功能中,它几乎比其他任何功能都更容易出错(不是因为它本身的错误,而是因为用户或程序员对文件名犯了错误)。
这是罪魁祸首:
char c;
请更改为:
int c;
fgetc
的返回类型是int
,而不是char
。 在某些平台上将int
转换为char
时,会得到奇怪的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.