Разница между 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,

Другие вопросы по тегам