为什么fgetc只能在C中读取PNG的某个字节?

时间:2017-01-27 05:32:55

标签: c stdio fgetc

我试图用以下方式读取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^@^@^@

为什么它只到某个字节然后完全退出读取文件?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

代码包含错误。

// Wrong
char c = fgetc(fd);

正确的版本是:

// Correct
int c = fgetc(fd);

正在发生的事情是PNG文件中出现的字节0xff。所以你得到:

char c = 0xff;

但那是一个溢出,在这种情况下,它碰巧导致:

char c = -1;

EOF也是-1。

(请注意,如果您阅读C标准,则表明我们实际上遇到了未定义的行为,但是对未定义行为的讨论可能会变成兔子洞。)

相关问题