在C中读取二进制文件

nam*_*ked 3 c file-io binaryfiles

我在C中读取二进制文件有以下问题.

我已经读过二进制文件的前8个字节.现在我需要从第9个字节开始读取.以下是代码:

fseek(inputFile, 2*sizeof(int), SEEK_SET);
Run Code Online (Sandbox Code Playgroud)

但是,当我打印存储检索值的数组的内容时,它仍然显示前8个字节,这不是我需要的.

有人可以帮我解决这个问题吗?

Eli*_*sky 10

假设:

FILE* file = fopen(FILENAME, "rb");
char buf[8];
Run Code Online (Sandbox Code Playgroud)

您可以读取前8个字节,然后读取接下来的8个字节:

/* Read first 8 bytes */
fread(buf, 1, 8, file); 
/* Read next 8 bytes */
fread(buf, 1, 8, file);
Run Code Online (Sandbox Code Playgroud)

或者跳过前8个字节fseek并读取接下来的8个字节(如果将文件中的第一个字节计为0,则包括8 ... 15):

/* Skip first 8 bytes */
fseek(file, 8, SEEK_SET);
/* Read next 8 bytes */
fread(buf, 1, 8, file);
Run Code Online (Sandbox Code Playgroud)

理解这一点的关键是C库函数会自动保留文件中的当前位置.fread在执行读取操作时移动它,所以下一个fread将在上一个完成之后立即开始.fseek只是移动它而不阅读.


PS:我的代码在这里读取问题所需的字节.(作为第二个参数提供的大小1 fread)

  • 注意:如果你想`read 8, skip 8, read 8` 使用 SEEK_CUR,像这样: `fread(buf, 1, 8, file);fseek(file, 8, SEEK_CUR);fread(buf, 1, 8 , 文件);` (2认同)

Jam*_*lis 8

fseek只需移动文件流的位置指针; 一旦移动了位置指针,就需要调用fread实际读取文件中的字节.

但是,如果您已经从文件中读取了前八个字节fread,则位置指针指向第九个字节(假设没有错误发生,文件长度至少为9个字节).当您调用时fread,它会使位置指针前进一个读取的字节数.您无需致电fseek移动它.

  • @ darkie15:然后你想使用`SEEK_CUR`,而不是'SEEK_SET`,它告诉`fseek`使用相对于当前位置的偏移量,而不是文件的开头. (2认同)