Разница между fread (& c, 1, 1, input) и fgetc (input) для чтения одного байта - PullRequest
0 голосов
/ 08 мая 2018

В настоящее время я пытаюсь прочитать файл PNG, по одному байту за раз, и получаю разные результаты, когда использую fread((void*), size_t, size_t, FILE*) и fgetc(FILE*).

Я, по сути, хочу «читать по одному байту за раз до конца файла», и я делаю это двумя разными способами. В обоих случаях я открываю нужное изображение в двоичном режиме через:

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 байтов (что имеет смысл, поскольку входной файл - это файл размером 380 КБ).

Однако в случае fgetc я останавливаюсь, как только достигаю байта со значением ff (что равно -1, значение макроса EOF.

У меня такой вопрос: если обе функции выполняют одно и то же, читая по одному байту за раз, как fread узнает, что продолжает читать, даже если встречается байт со значением EOF? И, исходя из этого, как fread узнает, когда останавливаться, если при чтении файла передается EOF?

1 Ответ

0 голосов
/ 08 мая 2018

fgetc возвращает int, а не char. EOF (и многие действительные коды символов) не могут быть сохранены в char, и попытка сделать это приведет к неопределенному поведению. Так что не делай этого. Сохраните возвращаемое значение в int.

...