zcy790811 2019-08-31 17:19 采纳率: 0%
浏览 444

Boost 二进制序列化,如何多次写入一次读取。

  1. 近期在用Boost对对象进行序列化以便存储工业控制中产生的数据。

{

文件头对象Header(1个)

定期或者不定期的数据文件对象Data(n个,n不确定)

}

具体如下:
(1)、系统启动时产生头文件,此时我创建二进制文件file,并将Header对象以序列化的方式写入到file中去,然后close(file)。

(2)后续有数据过来时打开file文件,然后将收到的Data对象序列化,存入file中,此时产生了一个新的Boost序列化文件,包含相关的Boost头等信息。随后写入文件file,并close。

(3) 重复(2)的操作,直至退出系统。

(4)读取文件时直接Open文件,将文件读入Boost二进制流对象ia;

ia >> Header;

ia >> Data1;

ia >> Data2

ia >> Dara...;

此时因为存储关系的原因,Boost无法准确读取Data文件,麻烦各位有相关经验的大佬告知下如何解决这个问题呢,谢谢。

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-31 02:46
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题可以通过使用Boost中的std::ifstreamstd::ofstream类来解决。这些类可以让你从一个标准输入/输出设备读取或写入数据。

    首先,你需要创建一个std::ofstream对象来打开你的文件并开始写入数据。然后,你可以通过调用std::ifstream对象的成员函数来读取数据。这样,你就可以避免Boost二进制流对象的限制了。

    以下是一个简单的示例:

    #include <iostream>
    #include <fstream>
    #include <boost/archive/text_oarchive.hpp>
    #include <boost/archive/text_iarchive.hpp>
    
    // 定义一些结构体用于存储数据
    struct Header {
        // ...
    };
    
    struct Data {
        // ...
    };
    
    int main() {
        // 创建一个Header对象
        Header header;
        
        // 创建一个Data对象
        Data data;
    
        // 打开一个新的文件
        std::ofstream file("output.bin", std::ios_base::binary);
        if (!file.is_open()) {
            std::cerr << "Failed to open file" << std::endl;
            return 1;
        }
    
        // 将Header对象序列化到文件中
        boost::archive::text_oarchive oa(file);
        oa << header;
        file.close();
    
        // 打开已关闭的文件
        std::ifstream file_in("output.bin");
        if (!file_in.is_open()) {
            std::cerr << "Failed to open file for reading" << std::endl;
            return 1;
        }
    
        // 读取数据
        boost::archive::text_iarchive ia(file_in);
        Header h;
        ia >> h; // 这里会抛出异常,因为Header已经被序列化为字节流
        Data d;
        ia >> d;
        // ...
    
        return 0;
    }
    

    在这个例子中,我们首先创建了一个std::ofstream对象来打开我们的文件,并将其设置为二进制模式。然后,我们将Header对象序列化到这个文件中。接着,我们再次打开这个文件,但这次是只读模式,所以我们不能使用Boost的std::ifstream对象。最后,我们从这个文件中读取HeaderData对象。

    注意:这只是一个基本的例子,实际的应用可能需要处理更多的细节,例如错误检查、数据类型转换等。

    评论

报告相同问题?