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

在C中读取x字节后的二进制文件,c,file,binary,fread,C,File,Binary,Fread,我试图从C中的二进制文件中读取双精度值,但二进制文件以整数开始,然后是我要查找的双精度值。 使用fread()读取时,如何跳过前4个字节? 谢谢试试这个: fseek(input, sizeof(int), SEEK_SET); 在调用fread之前 正如Weather Vane所说,如果文件是在与您正在编写的程序相同的系统架构中生成的,那么您可以安全地使用sizeof(int)。否则,您应该手动指定文件来源系统的整数大小。尝试以下操作: fseek(input, sizeof(int), S

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

试试这个:

fseek(input, sizeof(int), SEEK_SET);
在调用
fread
之前

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

尝试以下操作:

fseek(input, sizeof(int), SEEK_SET);
在调用
fread
之前


正如Weather Vane所说,如果文件是在与您正在编写的程序相同的系统架构中生成的,那么您可以安全地使用
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 

以此类推

只需读取这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(流、sizeof(int)、SEEK\u集)


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

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

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

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

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

fseek(流、sizeof(int)、SEEK\u集)


请注意,fseek以字节为单位移动文件指针(从文件开头的给定行中为1)<代码>整数可以是4个字节,也可以是系统特定的其他字节数。

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

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

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

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


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

在实现此类功能时要小心。如果文件不是在同一台计算机上创建的,则可能会由于不同的浮点规范而获得无效值

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

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

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


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

查看fseek()。但是要注意字体大小。“整数”可能并不总是4字节,它将取决于创建二进制文件的计算机的体系结构。谢谢。使用sizeof(int)而不是4字节可以吗?在C实现中可能不是这样,但OP说文件中有4个字节。如果文件不是在同一台机器上创建的,那么读取双精度也是有风险的,因为它们的格式可能不一样。整数不是有用的东西吗?比如文件中的
双精度值的数量?立即分配一个这样大小的数组将大大加快进程。但是要注意字体大小。“整数”可能并不总是4字节,它将取决于创建二进制文件的计算机的体系结构。谢谢。使用sizeof(int)而不是4字节可以吗?在C实现中可能不是这样,但OP说文件中有4个字节。如果文件不是在同一台机器上创建的,那么读取双精度也是有风险的,因为它们的格式可能不一样。整数不是有用的东西吗?比如文件中的
双精度值的数量?立即分配一个这样大小的数组将大大加快进程。这假设文件是在同一个系统中创建的。OP说是4个字节<代码>fseek(输入,4,搜索设置),假定文件是在同一系统中创建的。OP说是4个字节<代码>fseek(输入,4,搜索设置)
fread()
不接受
int*
指针,它确实接受
void*
@WeatherVane。更正。当函数接受
void*
指针时,它接受指向任何数据类型的指针而不使用强制转换。类似地,返回
void*
指针类型的函数旨在分配给类型化指针,而无需强制转换。
fread()
不接受
int*
指针,