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
,而不是 char
。 EOF
(以及许多实际的字符代码)不能存储在 char
中,尝试这样做将导致未定义的行为。所以不要那样做。将 return 值存储在 int
.
中
我目前正在尝试读入一个 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
,而不是 char
。 EOF
(以及许多实际的字符代码)不能存储在 char
中,尝试这样做将导致未定义的行为。所以不要那样做。将 return 值存储在 int
.