在 C 中读取 x 字节后的二进制文件

Reading from binary after x bytes in C

我试图从 C 中的二进制文件中读取双精度值,但二进制文件以整数开头,然后是我要查找的双精度值。 使用 fread() 读取时如何跳过前 4 个字节? 谢谢

试试这个:

fseek(input, sizeof(int), SEEK_SET);

在调用 fread.

之前

正如风向标所说,如果文件是在与您正在编写的程序相同的系统架构中生成的,您可以安全地使用 sizeof(int)。否则,您应该手动指定文件来源系统的整数大小。

只需读取那 4 个不需要的字节,例如

void* buffer = malloc(sizeof(double));
fread(buffer,4,1,input); //to skip those four bytes

fread(buffer,sizeof(double),1,input); //then read first double =)
double* data = (double*)buffer;//then convert it to double 

以此类推

您可以使用 fseek 跳过初始整数。如果你仍然坚持使用 fread,那么你可以先读取整数:

fread(ptr, sizeof(int), 1, stream).

当然你必须在调用fread之前声明ptr

正如我所说,fseek 是另一种选择:

fseek(stream, sizeof(int), SEEK_SET).

注意 fseek 以字节为单位移动文件指针(从文件开头的给定行中的 1); integer 可以是 4 或系统特定的其他字节数。

执行此类操作时要小心。如果文件不是在同一台机器上创建的,您可能会由于不同的浮点规范而得到无效值。

如果您正在阅读的文件是在同一台机器上创建的,请确保编写的程序正确处理了类型大小。

如果 writer 和 reader 都是用 C 开发的,并且应该 运行 只在同一台机器上,请使用 fseek() 和 writer 中使用的 sizeof(type)偏移参数。

如果写入二进制文件的机器与读取二进制文件的机器不同,您可能甚至不想使用 fread() 读取双打,因为它们的格式可能因架构不同而不同。

许多架构依赖于 IEEE 754 的浮点格式,但如果应用程序应该解决多平台支持,您应该确保可以从所有架构读取序列化格式(或在反序列化时转换) .