为什么 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 标准,就会发现我们实际上遇到了 未定义的行为, 但是对未定义行为的讨论可能会变成一个兔子洞。)