我试图从C中读取二进制值,但二进制文件以整数开头,然后是我要查找的双精度数。 使用fread()读取时如何跳过前4个字节? 感谢
答案 0 :(得分:3)
试试这个:
fseek(input, sizeof(int), SEEK_SET);
在致电fread
之前
。
正如Weather Vane所说,如果文件是在与您编写的程序相同的系统架构中生成的,则可以安全地使用sizeof(int)
。否则,您应手动指定文件源自的系统的整数大小。
答案 1 :(得分:1)
您可以使用fseek跳过初始整数。如果你仍然坚持使用fread,那么你可以先读取整数:
fread(ptr, sizeof(int), 1, stream)
。
当然,您必须在致电ptr
之前声明fread
。
正如我所说,fseek
是另一种选择:
fseek(stream, sizeof(int), SEEK_SET)
。
请注意fseek以字节为单位移动文件指针(文件开头的给定行中为1); integer
可以是系统特定的4个或其他字节数。
答案 2 :(得分:1)
实施这样的事情时要小心。如果文件未在同一台计算机上创建,则由于浮点规范不同,可能会得到无效值。
如果您正在阅读的文件是在同一台计算机上创建的,请确保编写的程序正确地解决了类型大小。
如果编写器和阅读器都是用C开发的,并且应该只在同一台机器上运行,请在offset参数中使用编写器中使用的sizeof(type)的fseek()。
如果写入二进制文件的机器与读取它的机器不同,您可能不希望甚至用fread()读取双打,因为它们的格式可能会因可能的不同架构而有所不同。
许多体系结构依赖于IEEE 754的浮点格式,但如果应用程序应该支持多平台支持,则应确保可以从所有体系结构中读取序列化格式(或在反序列化时进行转换)。 / p>
答案 3 :(得分:-1)
只需读取那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
等等