fread () читает слишком много данных - PullRequest
0 голосов
/ 24 января 2020

В настоящее время я пытаюсь прочитать двоичный файл по 16 байт за раз. Это замечательно до конца файла, где он читает полные 16 байтов независимо от того, закончился файл или нет. У меня есть файл с записью «ABCDEFGHIJKLMNOPQRSTUV», и он читает «QRSTUVGHIJKLMNOP» на втором проходе после успешного получения первых 16. Как я могу остановить его от повторного чтения этих байтов? Это то, что я имею в настоящее время. Очевидно, он не печатает второй проход данных, потому что fread не возвращает 16. Я должен отметить, что я ДОЛЖЕН читать 16 байтов за раз.

#define BS 16
unsigned char buffer[BS];                               // for storing each 16 bytes read
int i = 0;                                              // for iterating through readbytes

while (fread(buffer, 1, sizeof(buffer), ifp) == BS) {
    while (i < BS) {
            printf("Read: %c\n",buffer[i]);
        i++;
    }
    i = 0;
}

1 Ответ

2 голосов
/ 24 января 2020

Не перечитывает байты 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]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...