在C语言中读取二进制文件

4

我在C语言中读取二进制文件时遇到了以下问题。

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

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

然而,当我打印存储检索到的值的数组内容时,仍然显示给我前8个字节,这不是我需要的。请问有人能帮忙解决吗?
2个回答

11

假设:

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);

使用fseek跳过前8个字节,然后读取接下来的8个字节(如果将文件中的第一个字节视为0,则包括第8至15个字节):

/* Skip first 8 bytes */
fseek(file, 8, SEEK_SET);
/* Read next 8 bytes */
fread(buf, 1, 8, file);
理解这一点的关键是C库函数会自动为您保留文件中的当前位置。当fread执行读取操作时,它会移动当前位置,因此下一个fread将从上一个读取操作结束的位置开始。而fseek仅仅是移动当前位置而不进行读取。

P.S.: 由于您的问题要求读取字节,因此我的代码在fread的第二个参数中提供了大小1。


3
注意:如果你想要“读8个,跳过8个,再读8个”,可以使用SEEK_CUR,像这样:fread(buf, 1, 8, file);fseek(file, 8, SEEK_CUR);fread(buf, 1, 8, file);。 说明:以上内容是关于文件操作的,建议在读写文件时使用SEEK_CUR以实现读取特定位置的数据。 - ihadanny

10

fseek函数只是移动文件流中的位置指针。一旦你移动了位置指针,你需要调用fread函数来实际读取文件中的字节。

然而,如果你使用fread函数已经读取了文件中的前八个字节,则位置指针将指向第九个字节(假设没有发生错误并且文件至少有九个字节长)。当你调用fread函数时,它会将位置指针向前移动读取的字节数。你不需要调用fseek函数来移动指针。


谢谢,我明白了。另外,你能告诉我如何跳过特定数量的字节吗?目前,我只是在一个字节数组中读取要跳过的字节数以移动光标。不知道是否有任何库可以执行相同的功能。 - name_masked
2
@darkie15:那么您想使用SEEK_CUR而不是SEEK_SET,这告诉fseek使用相对于当前位置的偏移量,而不是文件开头。 - Cascabel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接