我试图用以下方式读取C中图像文件的字节,特别是PNG:
#include <stdio.h>
int main(){
FILE* fd = fopen("logo.png", "r");
char c = fgetc(fd);
while(c != EOF){
printf("%c", c);
c = fgetc(fd);
}
return 0;
}
当我运行该程序时,我得到了他:
<89>PNG^M
^Z
^@^@^@^MIHDR^@^@^@
为什么它只到某个字节然后完全退出读取文件?我该如何解决这个问题?
答案 0 :(得分:4)
代码包含错误。
// Wrong
char c = fgetc(fd);
正确的版本是:
// Correct
int c = fgetc(fd);
正在发生的事情是PNG文件中出现的字节0xff
。所以你得到:
char c = 0xff;
但那是一个溢出,在这种情况下,它碰巧导致:
char c = -1;
EOF
也是-1。
(请注意,如果您阅读C标准,则表明我们实际上遇到了未定义的行为,但是对未定义行为的讨论可能会变成兔子洞。)