在 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 的浮点格式,但如果应用程序应该解决多平台支持,您应该确保可以从所有架构读取序列化格式(或在反序列化时转换) .
我试图从 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 的浮点格式,但如果应用程序应该解决多平台支持,您应该确保可以从所有架构读取序列化格式(或在反序列化时转换) .