C - Как обрабатывать последнюю часть файла, если буфер больше?

не возможно ли читать байты, оставшиеся в файле, который меньше размера буфера?

char * buffer = (char *)malloc(size);
FILE * fp = fopen(filename, "rb");

while(fread(buffer, size, 1, fp)){
    //do something
}

Предположим, что размер равен 4, а размер файла - 17 байт. Я думал, что fread может обрабатывать и последнюю операцию, даже если байты, оставшиеся в файле, меньше размера буфера, но, по-видимому, он просто завершает цикл while, не читая один последний байт.

Я попытался использовать более низкий системный вызов read (), но по какой-то причине я не мог прочитать какой-либо байт.

Что делать, если fread не может обрабатывать последнюю часть байтов, размер которой меньше размера буфера?

4
nl ja de

2 ответы

Да, разверните свои параметры.

Вместо запроса одного блока байтов size , вы должны запросить size блоки из 1 байта. Затем функция вернет количество блоков (байтов), которые она могла прочитать:

int nread;
while( 0 < (nread = fread(buffer, 1, size, fp)) ) ...
4
добавлено
ах я неправильно использовал эти два аргумента ...! благодаря
добавлено автор REALFREE , источник

попробуйте использовать «man fread»

в нем четко указаны следующие вещи, которые сами отвечают на ваш вопрос:

SYNOPSIS
size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);

DESCRIPTION
  fread() copies, into an array pointed to by ptr, up to nitems items of
  data from the named input stream, where an item of data is a sequence
  of bytes (not necessarily terminated by a null byte) of length size.
  fread() stops appending bytes if an end-of-file or error condition is
  encountered while reading stream, or if nitems items have been read.
  fread() leaves the file pointer in stream, if defined, pointing to the
  byte following the last byte read if there is one.

  The argument size is typically sizeof(*ptr) where the pseudo-function
  sizeof specifies the length of an item pointed to by ptr.

RETURN VALUE
  fread(), return the number of items read.If size or nitems is 0, no
  characters are read or written and 0 is returned.

  The value returned will be less than nitems only if a read error or
  end-of-file is encountered.  The ferror() or feof() functions must be
  used to distinguish between an error condition and an end-of-file
  condition.
0
добавлено
Я не думаю, что это «ясно» ответ. В нем говорится, что size = 1 решает проблему и возвращает oef, но не объясняет, как бороться с последним блоком, когда размер меньше размера буфера. Я думаю, что лучше проверить размер файла с помощью fstat перед чтением, когда вы знаете, сколько байтов читать и может читать его с любым размером бокса, который вы хотите.
добавлено автор ton, источник