Вопрос

У меня возникла следующая проблема с чтением двоичного файла в 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)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top