Чтение двоичного файла в C - PullRequest
3 голосов
/ 02 апреля 2010

У меня возникла следующая проблема с чтением двоичного файла в C.

Я прочитал первые 8 байтов двоичного файла. Теперь мне нужно начать чтение с 9-го байта. Ниже приведен код:

fseek(inputFile, 2*sizeof(int), SEEK_SET);

Однако, когда я печатаю содержимое массива, в котором храню извлеченные значения, он все равно показывает первые 8 байтов, что мне не нужно.

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

10 голосов
/ 02 апреля 2010

Предполагая, что:

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)

8 голосов
/ 02 апреля 2010

fseek просто перемещает указатель позиции потока файла; как только вы переместили указатель положения, вам нужно вызвать fread, чтобы фактически прочитать байты из файла.

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

...