Чтение двоичного файла в C
-
23-09-2019 - |
Вопрос
У меня возникла следующая проблема с чтением двоичного файла в C.
Я прочитал первые 8 байт двоичного файла.Теперь мне нужно начать чтение с 9-го байта.Ниже приведен код:
fseek(inputFile, 2*sizeof(int), SEEK_SET);
Однако когда я печатаю содержимое массива, в котором храню полученные значения, он все равно показывает мне первые 8 байтов, а это не то, что мне нужно.
Может ли кто-нибудь помочь мне с этим?
Решение
fseek
просто перемещает указатель позиции файлового потока;как только вы переместите указатель позиции, вам нужно вызвать fread
для фактического чтения байтов из файла.
Однако, если вы уже прочитали первые восемь байтов файла, используя fread
, указатель позиции остается указывающим на девятый байт (конечно, при условии отсутствия ошибок и длины файла не менее девяти байт).Когда ты звонишь fread
, он перемещает указатель позиции на количество прочитанных байтов.Вам не обязательно звонить fseek
чтобы переместить его.
Другие советы
Предполагая:
FILE* file = fopen(FILENAME, "rb");
char buf[8];
Вы можете прочитать первые 8 байт, а затем следующие 8 байт:
/* Read first 8 bytes */
fread(buf, 1, 8, file);
/* Read next 8 bytes */
fread(buf, 1, 8, file);
Или пропустите первые 8 байтов с помощью fseek
и читаем следующие 8 байт (8..до 15 включительно, если первый байт в файле считать за 0):
/* Skip first 8 bytes */
fseek(file, 8, SEEK_SET);
/* Read next 8 bytes */
fread(buf, 1, 8, file);
Ключом к пониманию этого является то, что функции библиотеки C сохраняют текущая позиция в файле для вас автоматически. fread
перемещает его, когда он выполняет операцию чтения, поэтому следующий fread
начнется сразу после завершения предыдущего. fseek
просто перемещает его, не читая.
P.S.:Мой код здесь читает байты как задан ваш вопрос.(Размер 1 предоставляется в качестве второго аргумента fread
)