将类的向量写入文件的方法

Ways to write a vector of a class to a file

本文关键字:文件 方法 向量      更新时间:2023-10-16

我不确定我应该如何措辞,所以我会尝试把它放在代码中。(这有很多错误我知道它不会编译它只是为了显示我想做什么,因为我无法用语言表达(

    using namespace std; //for correctness sake
    class foo {
    public:
        foo(int a=0, int n=0);
        void stuff(int a);
        void function(int n);
        const int get_function() {return n;}
        const int get_stuff(){return a;}
    private: 
       int n, a;
    };
    struct Store{
        public: get_foo(){return vector<f.foo>;} //I'm not too sure of the syntax here but you get the idea
    private: 
        foo f;
    }

基本上,我想获取类 foo 中返回的所有信息,并将其格式化后输出到一个文件中。问题是,我需要在文件中制作许多这些内容,并且它必须能够读回它才能有任何价值。因此,仅将每个连续的foo类附加到文件中是行不通的(至少我看不出如何(。

我尝试使用 ostream 重载 << 运算符,但我不确定如何调用它以将其写入文件。欢迎任何建议!谢谢。

我认为你的Store应该是这样的:

struct Store
{
public:
    std::vector<foo> get_foo()
    {
       return f;
    }
private: 
    std::vector<foo> f;
};

要重载std::ostream<<

std::ostream& operator<<(std::ostream& out, const Store& f)
{
  for (auto &x : f.get_foo())
    out << x.get_function() << ", " << x.get_stuff() << "n";
  return out;
}
//Without auto
std::ostream& operator<<(std::ostream& out, const Store& f)
{
  std::vector<foo> q = f;
  for (int i=0; i<q.size(); i++)
    out << q[i].get_function() << ", " << q[i].get_stuff() << "n";
  return out;
}

你的代码有很多问题。

如此之多,很明显你从未读过任何C++书,只是在尝试编译器。

别这样。由于许多独立的原因,C++确实是世界上处理这种方式的最糟糕的语言。

不管你有多聪明。

实际上,在某些领域,聪明是一个问题,因为许多C++规则不是连贯的逻辑设计的结果,而是历史演变和委员会决策的结果。即使是哈里·塞尔登也无法正确预见委员会会做出什么决定,你无法推断历史。

只要挑选一本好书,从头到尾读完。没有其他明智的方法来学习C++。

关于将结构写入文件,

该主题通常称为"序列化",它处理将活动对象转换为死字节序列(写入文件或通过网络发送(的稍微更一般的问题,以及将字节序列转换回活动对象的反向问题"反序列化"(在同一系统上, 在另一个相同的系统上,甚至在不同的系统上(。

这个问题有很多方面,例如,如果您关心的是系统之间的可移植性、速度、字节序列的大小、重新加载字节序列的能力,这些序列在您的类因您发展程序而略有不同时保存回来(版本控制(。

您可以做的最简单的事情就是将内容fwrite到文件中,但这通常只是C++中的胡说八道,并且出于多种原因,即使技术上可行,这也是一种糟糕的方式。例如,您不能直接fwrite std::vector对象并希望将其读回。

我认为你需要这样的东西:

template<typename T>
std::ostream& operator << (std::ostream& out, const std::vector<T*>& elements)
{
  for (size_t i = 0; i < elements.size(); i++)
    out << elements[i] << ", ";
  return out << std::endl;
}