提问者:小点点

我如何保存一个包含另一个对象向量的对象到文件中,并使用C++中的二进制文件从文件中读回?


这是我读写向量的代码; 我在执行时没有收到错误,但是每当我从它回读时; 它给出了整数的随机值,而不是50和100。 我做错了什么?

我已经在另一个对象中使用了向量对象,并且我正在尝试使用对象的二进制归档来归档它。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

class Rest{
    int value;
    public:
        void setvalue(int value){this->value=value;}
        int getvalue(){return value;}
};

class Admin{
    vector<Rest> restaurant;
    public:
        Admin(){}

        void setValue(int value){
            Rest obj1;
            Rest obj2;
            obj1.setvalue(value);
            obj2.setvalue(value+50);
            restaurant.push_back(obj1);
            restaurant.push_back(obj2);
        }
        vector<Rest> getRestFromFile(){
            Admin obj;
            fstream getsavedvector("Testsave.BIN", ios::in | ios::binary);
            getsavedvector.read(reinterpret_cast<char*> (&obj), sizeof(obj));
            getsavedvector.close();

            return obj.getRest();
        }
        void setRestVectorToFile(Admin obj){
            fstream savevector("Testsave.BIN", ios::out | ios::binary);
            savevector.write(reinterpret_cast<char*> (&obj),sizeof(obj));
            savevector.close();
        }
        void setRestVector(vector<Rest> restaurant){
            for(int i=0;i<restaurant.size();i++){
                this->restaurant.push_back(restaurant[i]);
            }
        }
        vector<Rest> getRest(){
            return this->restaurant;
        }
        void Display(){
            for(auto v: restaurant){
                cout<<v.getvalue()<<endl;
            }

        }
};

int main()
{    
    Admin obj;
    obj.setValue(50);
    obj.setRestVectorToFile(obj);

    Admin obj2;
    obj2.setRestVector(obj2.getRestFromFile());
    obj2.Display();
}

共1个答案

匿名用户

基本上,您做错的是,您不能仅仅将C++对象强制转换为char*,然后在磁盘上转储一些字节,并期望这样做能起作用。 这在一些有限的情况下是可行的,比如,当你只是写基本的对象,比如整数,或者只包含整数的结构,或者类似的东西,但是对于更复杂的东西,比如向量,它是行不通的。 正确的方法是提出或使用现有的序列化格式,以便在写入或读取文件时对向量进行适当的编码。

在这种情况下,您可以使用一个非常简单的方案,无需太多更改,即首先存储向量的长度,然后依次存储每个元素。 这很容易读和写。 如果您想要一个更通用的解决方案,您将希望了解JSON,msgpack,XML等格式,甚至SQLite或PostgreSQL等数据库管理系统。 哪个是“正确”的选择取决于您的应用程序,在这种情况下,特别是如果您只是学习文件的读写,您可以将自己的简单格式作为练习滚动。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(保存|包含|对象|向量|对象|文件|中|c++|中|二进制|文件|文件|中|读|回)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?