繁体   English   中英

fgetc返回一个未知字符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM