【问题标题】:C++ -- reading dynamically allocated vectors from a binary fileC++——从二进制文件中读取动态分配的向量
【发布时间】:2012-04-21 03:14:59
【问题描述】:

我正在解决一个问题,但我不确定我是否正确执行此操作,或者我是否有正确的方法。到目前为止,我的代码只给了我段错误。

我有一个简单的小收据编写程序来练习一些 C++ 概念,其中之一是二进制文件 i/o。我有几个数组保存数据(一个保存服务类型的字符串,另一个保存相应的双倍成本)。我有一个小菜单,二进制部分的书写很好。但是,我不确定如何从文件中读取这些内容。

我目前正在使用一个结构来保存各种数据成员(客户姓名、总费用等),并且我想将他们选择的所有服务以及相应的价格写入一个文件,然后能够读回来。这些当前存储在结构中的向量中。

我想我了解如何从二进制文件读取/写入字符串(写入字符串的长度,然后写入数据,然后读取长度,然后将那么多字节读取到字符串中)。但是我如何用向量做到这一点?我了解如何使用固定大小成员(即整数)的向量来完成它,但是字符串向量呢?在这种情况下,成员没有设置大小,所以我不知道如何读取它们。

这甚至可能吗?如果有人能指出我正确的方向,那将非常有帮助。大约一年前有一个类似的论坛发布,但它对我没有多大帮助。

tl;dr -- 如何从二进制文件中读取可变长度字符串的可变大小向量?

【问题讨论】:

  • 我们需要查看代码才能为您提供帮助
  • 查看 Boost 序列化 boost.org/doc/libs/1_49_0/libs/serialization/doc/index.html>
  • 你试过在调试器中运行程序吗?它将帮助您查明段错误的位置,还可以让您检查变量以了解可能的原因。
  • 本质上只是阅读过程的递归堆叠。

标签: c++ string file vector binary


【解决方案1】:

转述:

>如何读回长度,然后将那么多字节读入带有向量的字符串?

一次一个字符串:

// Untested
std::vector<std::string> ReadSomeStrings(std::istream& inFile, size_t howMany) {
  std::vector<std::string> result;
  for(int i = 0; i < howMany; ++i) {
    std::size_t len;
    is.read(&len, sizeof len);
    std::string s(len, '\0');
    is.read(&s[0], s.size());
    result.push_back(s);
  }
  return result;
}

【讨论】:

  • 明白了。我突然想到我必须这样做。我想我将存储另一个包含所有字符串长度的向量。谢谢。
【解决方案2】:

您需要将数据打包或封装到对象中并将它们序列化,正如 Mark 使用 http://www.boost.org/doc/libs/1_49_0/libs/serialization/doc/index.html 指出的那样。您可以在此处找到示例和详细帮助。 搜索一个非常简单的案例。 :)

编辑:我为你做了一个快速而肮脏的例子。享受。 (为格式化道歉。)

#include <cstddef> // NULL
#include <iomanip>
#include <iostream>
#include <fstream>
#include <iterator>

#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/serialization/assume_abstract.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/vector.hpp>

class family_names
{
    friend class boost::serialization::access;
    std::vector<std::string> m_names;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
    ar & m_names;
    }

    friend std::ostream & operator<<(std::ostream &os, const family_names& fn);

    public:
family_names(const std::vector<std::string>& names)
    : m_names(names)
{}

family_names() {}
    };

    std::ostream & operator<<(std::ostream &os, const family_names& fn)
    {
std::ostream_iterator<std::string> out_it (std::cout,", ");
std::copy(fn.m_names.begin(), fn.m_names.end(), out_it);
return os;
    }

    void save(const family_names &s, const char * filename){
// make an archive
std::ofstream ofs(filename);
boost::archive::text_oarchive oa(ofs);
oa << s;
    }

    void restore(family_names &s, const char * filename)
    {
// open the archive
std::ifstream ifs(filename);
boost::archive::text_iarchive ia(ifs);

// restore the family names from the archive
ia >> s;
    }

    int _tmain(int argc, _TCHAR* argv[])
    {

std::vector<std::string> vec_names;
vec_names.push_back("Jason");
vec_names.push_back("Mark");
vec_names.push_back("Ludmilla");


family_names names(vec_names);
std::string filename = "c:\\Dev\\demofile.txt";

std::cout << names << std::endl;
save(names, filename.c_str());

family_names names_back;
restore(names_back, filename.c_str());
std::cout << names_back << std::endl;

return 0;
  }

【讨论】:

  • 酷。谢谢 - 我还没有真正做过任何关于 boost 的事情,但我必须检查一下。
【解决方案3】:

我猜你使用 >> 和

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 2021-09-07
    • 2016-08-30
    • 2023-03-13
    • 2012-05-16
    相关资源
    最近更新 更多