fread(&c, 1, 1, input) 和 fgetc(input) 读取一个字节的区别

Difference between fread(&c, 1, 1, input) and fgetc(input) for reading one byte

我目前正在尝试读入一个 PNG 文件,一次一个字节,当我使用 fread((void*), size_t, size_t, FILE*)fgetc(FILE*) 时我得到了不同的结果。

我本质上想要 "Read one byte at a time until the file ends",我用两种不同的方式来实现。在这两种情况下,我通过以下方式以二进制模式打开我想要的图像:

FILE* input = fopen( /* Name of File */, 'rb');

并将每个字节存储在一个字符中,char c

恐惧:while( fread(&c, 1, 1, input) != 0) //read until there are no more bytes read

fgetc: while( (c = fgetc(input)) != EOF) //Read while EOF hasn't been reached

fread的情况下,我读取了我需要做的所有字节。读取函数在文件末尾停止,我最终打印了所有 380,000 个字节(这是有道理的,因为输入文件是一个 380kB 的文件)。

但是,在 fgetc 的情况下,一旦到达值为 ff 的字节(即 -1,即宏 EOF 的值),我就会停止。

我的问题是,如果两个函数都在做同样的事情,一次读取一个字节,那么 fread 如何知道继续读取,即使它遇到一个值为 EOF 的字节?以此为基础,如果在读取文件时传递了 EOF,fread 如何知道何时停止?

fgetc return 是 int,而不是 charEOF(以及许多实际的字符代码)不能存储在 char 中,尝试这样做将导致未定义的行为。所以不要那样做。将 return 值存储在 int.