美文网首页
2019-03-06 C++二进制文件结构体读取问题

2019-03-06 C++二进制文件结构体读取问题

作者: 东旭曦影 | 来源:发表于2019-03-06 21:29 被阅读0次

C与C++的二进制文件读写

参考下面的文章,C/C++读写文本文件、二进制文件

https://blog.csdn.net/nichengwuxiao/article/details/78789225

C的文件操作

#include <stdio.h>
ephDE_recOne rec;                           // 结构定义
FILE * f = fopen("file_name","rb");         // 文件打开
if(f == NULL)  return;                      // 打开失败
fread(&rec, sizeof(ephDE_recOne),1, f);     // 读二进制文件数据
fclose(f);

C++的文件操作

#include <iostream>
#include <fstream>
ephDE_recOne rec;                                     // 结构定义
ifstream infile("file_name",ios::in | ios::binary);   // 文件打开
if(!infile)  return;                                  // 打开失败
infile.read((char *)&rec, sizeof(double)*deLen);      // 读二进制文件数据
infile.close();

C++的二进制文件读取结构体问题

在编写一个DE405星历文件的读取函数中,结构体读取后数值与实际的不一致。
在下面这段代码中,读取struct后labelconstName内容正确,后面结构数值不正确。

struct ephDE_recOne{
    char    label[3][84];
    char    constName[400][6];
    double  timeData[3];
    int     numConst;
    double  AU;
    double  EMRAT;
    int     coeffPtr[12][3];
    int     DENUM;
    int     libratPtr[3];
    int     RSize;
};
const int deLen = 1018;
void read(){
    using namespace std;
    ephDE_recOne rec;
    ifstream infile(DE_file_path.c_str(), ios::in | ios::binary);
    if(!infile)
        throw exception();
    infile.read((char *)&rec, sizeof(double)*deLen);
    infile.close();
}    

通过比较读取结果与实际数值发现,读取到的AU数值为实际的EMRAT数值。因此猜测是数据结构体的发生了错位情况。

代码编译的字节对齐问题 #pragma pack(push,1)

由于不是专业出身,这个内存字节的原因不能说清楚。原来在用fortran编写带有通信接口的程序时曾遇到过类似问题,虽然代码不做改动,但是否指定单字节内存对齐将影响数据处理的结果。
这里,我使用的是Qt的mingw32编译套件编译的程序,将上述代码的结构定义修改为

#pragma pack(push, 1)
struct ephDE_recOne{
    char    label[3][84];
    char    constName[400][6];
    double  timeData[3];
    int     numConst;
    double  AU;
    double  EMRAT;
    int     coeffPtr[12][3];
    int     DENUM;
    int     libratPtr[3];
    int     RSize;
};
#pragma pack(pop)

二进制文件的数据结构能够正确读写。

相关文章

  • 2019-03-06 C++二进制文件结构体读取问题

    C与C++的二进制文件读写 参考下面的文章,C/C++读写文本文件、二进制文件 https://blog.csdn...

  • Golang I/O笔记

    1. 基础 2. 结构体输出 3. 基本的IO接口 命令行读取输入 文件中读取 缓冲IO 统计文件行数 二进制文件...

  • tinyxml 库

    C++读取xml配置文件 - tinyxml2tinyxml基本结构xml文件示例类结构demo C++读取xml...

  • 字符串相关函数总结2

    fgets(字符指针,字符大小,文件结构体指针) 从文件结构体指针stream中读取数据,每次读取一行。读取的数据...

  • C中将结构体写入文件及读取

    需要导入的头文件 写入结构体 假设有结构体: 结构体写入文件的方法: 读取文件中的结构体 知识扩展 函数fopen...

  • Blob

    二进制文件下载 二进制文件读取

  • C++工具函数

    C++ 工具函数 读取二进制文件 字符串split 删除文件 定义枚举类,并将枚举常量转成int 获取当前目录剩余...

  • Python读取二进制文件

    实际项目中经常遇到读取二进制问题,Python下读取二进制文件一般用Python的文件打开读写相关函数和struc...

  • node基本模块之fs

    异步方式 读取文本文件 读取二进制文件

  • iOS-结构体(Struct)结构体头文件多次被引用报错

    问题描述:iOS--Socket开发中,直接拿c++的结构体文件使用,导致多次引用这个文件报错。(开发工程中使用没...

网友评论

      本文标题:2019-03-06 C++二进制文件结构体读取问题

      本文链接:https://www.haomeiwen.com/subject/hmqfpqtx.html