繁体   English   中英

在C中的x字节之后从二进制读取

[英]Reading from binary after x bytes in C

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

尝试这个:

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

在打电话给fread之前。

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

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

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

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

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

fseek(stream, sizeof(int), SEEK_SET)

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

实施这样的事情时要小心。 如果文件不是在同一台计算机上创建的,则由于不同的浮点规范,您可能会得到无效的值。

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

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

如果写入二进制文件的机器与读取二进制文件的机器不同,则您甚至可能不想使用fread()读取双精度型,因为其格式可能会因体系结构不同而有所不同。

许多体系结构都依赖于IEEE 754的浮点格式,但是如果应用程序应该解决多平台支持的问题,则应确保可以从所有体系结构中读取序列化格式(或在反序列化时进行转换)。

只需读取这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 

等等

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM