C++:使用 Boost 序列化来写入/读取文件 [关闭]

Posted

技术标签:

【中文标题】C++:使用 Boost 序列化来写入/读取文件 [关闭]【英文标题】:C++: Use Boost Serialization to write/read files [closed] 【发布时间】:2015-02-21 21:00:11 【问题描述】:

我需要写入/读取一个包含 std::map 的文件。该文件必须在程序启动时读取(如果存在)。我正在使用 boost 的 fstream,但我得到了这个:

"terminate called after throwing an instance of 'boost::archive::archive_exception'
  what():  input stream error"

好吧,我真的不知道发生了什么......这些是我的台词:

map<int64_t, int64_t> foo;
filesystem::path myFile = GetWorkingDirectory() / "myfile.dat";
[...............] // some code

filesystem::ifstream ifs(myFile);
archive::text_archive ta(ifs);
if (filesystem::exists(myFile)

   ta >> foo; // foo is empty until now, it's fed by myFile
   ifs.close();

我做错了什么?任何的想法? 谢谢。

附:请注意,在某些行之后,我需要执行相反的操作:将 std::map foo 写入 myfile.dat。

编辑:如果我使用 std::ifstream,一切正常,将文件保存在我运行应用程序的同一目录中。但是使用 boost 和他的路径,出现了问题。

【问题讨论】:

你的实际输入是什么? 我尝试了没有输入(删除文件)和我之前使用 std::ofstream 以相同方式创建的 file.dat.. 都给了我上面的错误 一个文件怎么可能包含std::map boost.org/doc/libs/1_36_0/libs/serialization/doc/index.htmlafaik 链接中的哪个文件中提到了std::map?我看不到。 【参考方案1】:

我有点生气。您显然在使用 Boost Serialization(archive/ 标头是该库的一部分),但不知何故您对此没有说任何话。因为它很容易演示:

Live On Coliru

#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/map.hpp>
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>

using namespace boost;

int main() 
    std::map<int64_t, int64_t> foo;
    filesystem::path myFile = filesystem::current_path() / "myfile.dat";

    if (filesystem::exists(myFile))
    
        filesystem::ifstream ifs(myFile/*.native()*/);
        archive::text_iarchive ta(ifs);

        ta >> foo; // foo is empty until now, it's fed by myFile

        std::cout << "Read " << foo.size() << " entries from " << myFile << "\n";
     else 
        for (int i=0; i<100; ++i) foo.emplace(rand(), rand());
        filesystem::ofstream ofs(myFile/*.native()*/);
        archive::text_oarchive ta(ofs);

        ta << foo; // foo is empty until now, it's fed by myFile
        std::cout << "Wrote " << foo.size() << " random entries to " << myFile << "\n";
    


打印

Wrote 100 random entries to "/tmp/myfile.dat"

第二次运行:

Read 100 entries from "/tmp/myfile.dat"

【讨论】:

首先感谢您的及时回复。好吧,很抱歉我的问题写得不好,但无论如何你都说到点子上了。我的代码与您的示例完全相同。那么为什么我会收到该错误?我很困惑.. 编辑:我解决了更改路径..不知道为什么,但现在它可以正常工作。不过,谢谢,

以上是关于C++:使用 Boost 序列化来写入/读取文件 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Boost序列化在一定文件大小后抛出“输入流错误”

向/从映射文件 C++ 写入和读取

boost::async 读写在一次读取和两次写入后卡住

C++ Boost.Asio - tcp 套接字异步写入

使用 C++ 在运行时使用转义序列

使用 Boost [C++] 将 http 文件内容读取到字符串