为什么 fgetc 在 C 中只能读取 PNG 的某个字节?
Why does fgetc only read up to a certain byte of PNG in C?
我正在尝试通过以下方式读取 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^@^@^@
为什么只读到某个字节就完全退出读取文件?我该如何解决这个问题?
代码包含错误。
// Wrong
char c = fgetc(fd);
正确的版本是:
// Correct
int c = fgetc(fd);
发生的事情是 0xff
字节出现在您的 PNG 文件中的某处。所以你得到:
char c = 0xff;
但这是一个溢出,在这种情况下它恰好导致:
char c = -1;
而EOF
也是-1。
(请注意,如果您阅读 C 标准,就会发现我们实际上遇到了 未定义的行为, 但是对未定义行为的讨论可能会变成一个兔子洞。)
我正在尝试通过以下方式读取 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^@^@^@
为什么只读到某个字节就完全退出读取文件?我该如何解决这个问题?
代码包含错误。
// Wrong
char c = fgetc(fd);
正确的版本是:
// Correct
int c = fgetc(fd);
发生的事情是 0xff
字节出现在您的 PNG 文件中的某处。所以你得到:
char c = 0xff;
但这是一个溢出,在这种情况下它恰好导致:
char c = -1;
而EOF
也是-1。
(请注意,如果您阅读 C 标准,就会发现我们实际上遇到了 未定义的行为, 但是对未定义行为的讨论可能会变成一个兔子洞。)