1

Есть ли способ определить объем данных, передаваемых на устройство или с него. Я не спрашиваю о размере блока или сектора. Я хочу знать сумму, переданную операцией чтения / записи.

Например, если я хочу передать 1 блок размером 0x200 байт:

block = fread((void *)& Block, 0x200, 1, FILE * fp);

что произойдет, если я достигну конца файла, и будет прочитан только частичный блок, и как определить фактическое число байтов.

Я понимаю, что могу сделать наоборот, как в:

bytes = fread((void *)& Block, 1, 0x200, FILE * fp);

но что если я захочу прочитать несколько блоков ???

Есть ли функция ядра, такая как ioctl(dev, FNUM), которая будет возвращать фактическое количество байтов?

Большое спасибо, CB

1 ответ1

0

Как вы уже поняли, вы можете использовать параметр размера 1 байт, а количество элементов - 0x200.

bytes = fread((void*)&Block, 1, 0x200, fp);

Тогда fread вернет количество фактически прочитанных элементов (количество байтов).

Обычно fread размещается в цикле для чтения всех блоков. В качестве альтернативы (в зависимости от ваших реальных требований) системные вызовы fstat или stat могут использоваться для получения размера файла перед его чтением.

На странице справочника fread упомянутое короткое число объектов означает, например, что если в читаемом файле есть 0x201 байт, первое чтение вернет 0x200, второе чтение вернет 1.

ВОЗВРАЩАЕМЫЕ ЦЕННОСТИ

 The functions fread() and fwrite() advance the file position indicator for
 the stream by the number of bytes read or written.  They return the number
 of objects read or written.  If an error occurs, or the end-of-file is
 reached, the return value is a short object count (or zero).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .