Разница между fread(&c, 1, 1, input) и fgetc(input) для чтения одного байта
В настоящее время я пытаюсь прочитать файл PNG, по одному байту за раз, и получаю разные результаты, когда использую fread((void*), size_t, size_t, FILE*)
а также fgetc(FILE*)
,
По сути, я хочу "читать по одному байту за раз до конца файла", и я делаю это двумя разными способами. В обоих случаях я открываю нужное изображение в двоичном режиме через:
FILE* input = fopen( /* Name of File */, 'rb');
И хранить каждый байт в символе, char c
Fread: 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
Случай, я прочитал все байты, которые мне нужно сделать. Функция чтения останавливается в конце файла, и я в итоге печатаю все 380000 байтов (что имеет смысл, поскольку входной файл - это файл размером 380 КБ).
Однако в fgetc
случай, я останавливаюсь, как только я достигаю байта со значением ff
(который равен -1, значение макроса EOF
,
Мой вопрос заключается в том, что если обе функции выполняют одно и то же, читая по одному байту за раз, как fread узнает, что продолжить чтение, даже если он встречает байт со значением EOF
? И, опираясь на это, как Fread знает, когда остановиться, если EOF
передается при чтении файла?
1 ответ
fgetc
возвращает int
не char
, EOF
(и многие фактические коды символов) не могут быть сохранены в char
и попытка сделать это приведет к неопределенному поведению. Так что не делай этого. Сохраните возвращаемое значение в int
,