Не перечитывает байты GHI…NOP
; они все еще находятся в буфере предыдущего успешного чтения. Когда fread()
сообщает о коротком чтении, содержимое буфера после данных, которые он сообщает о чтении, является неопределенным. Вам нужно сохранить возвращаемое значение из fread()
- это size_t
- и использовать его для руководства. Он сообщает 6 байтов; доступ к чему-либо после этого приводит к неопределенному (неопределенному, неопределенному - обычно «нежелательному») поведению.
Вы должны определить int i = 0;
внутри внешнего цикла while
; тогда вам не понадобится конечный i = 0;
после внутреннего l oop. Или даже просто подпрограмма for
l oop, как прокомментировал MM .
Следовательно:
#define BS 16
unsigned char buffer[BS];
size_t nbytes;
while ((nbytes = fread(buffer, 1, sizeof(buffer), ifp)) == BS)
{
for (size_t i = 0; i < BS; i++)
printf("Read: %c\n", buffer[i]);
}
printf("Short read (%zu bytes):\n", nbytes);
for (size_t i = 0; i < nbytes; i++)
printf("Short: %c\n", buffer[i]);