C++ 将复杂结构存储到文件

C++ 将复杂结构存储到文件,c++,C++,我有以下课程 class WriterCollection { std::vector<Writer> arts; public: WriterCollection(void); ~WriterCollection(void); void DisplayMenu(); void AddWriter(); void EditWriter(); void ShowWriterList(); int SearchWriter(std::string name = ""); }; 发生

我有以下课程

class WriterCollection
{
std::vector<Writer> arts;
public:
WriterCollection(void);
~WriterCollection(void);


void DisplayMenu();
void AddWriter();
void EditWriter();
void ShowWriterList();
int SearchWriter(std::string name = "");
};
发生的事情是,它要求我为每个作家取一个名字,我还可以为每个作家添加一个书籍向量

我保存它:

std::ofstream output_file("db.data", std::ios::binary);
output_file.write((char*)&ac, sizeof(ac));
output_file.close();
当程序启动时,我试着读它

std::ifstream in( "db.data", std::ios::in );
if ( !in )
{
   std::cerr << "File could not be opened." << std::endl;
} 
in.read( reinterpret_cast< char * >( &ac ), sizeof( ac ) );
std::ifstream-in(“db.data”,std::ios::in);
如果(!in)
{
STR::CERP不把一个C++类存储为二进制转储。
首先,std::vector包含指向实际数据的指针和大小。写入文件的只是指针和大小;实际数据没有写入。读回数据后,指针指向内存中的某个位置,但该位置没有数据

但是,即使您的数据都存储在一个位置,编写二进制转储仍然是一个坏主意。如果您的类具有虚拟成员函数,则内存中的对象包含指向相应虚拟表的指针。无法保证下次运行程序时虚拟表将位于同一位置(可能在更改一些代码和重新编译之后)。当然,更不用说,如果您自己更改了类,您的二进制转储将不再适合新的类定义

作为一个更一般的经验法则:除非你在做低级的事情(比如与设备接口),否则在你的代码中有一个
reinterpret\u cast
,几乎总是表明你在做一些你不应该做的事情


正确的处理方法是迭代所有writer对象,并以定义良好的方式写入它们的数据。然后,数据格式是二进制还是文本格式取决于您(如果有疑问,请选择文本格式,如果只是因为它更易于调试)。但重要的是,不要盲目地转储内存中的数据,而是实际定义格式,并确保数据以该格式写入。

必须将向量的内容写入文件,而不是向量本身。您只需写入
ac
(在另一种语言中,您正在进行浅层复制)。但是向量使用指向堆内存的指针来存储其数据(加载时,它将指向垃圾内存)你需要自己制作一个序列化程序,或者找到一个地方。AcIK C++没有一个标准的机制。也许你需要。它支持STL容器。不能使用第三方:
std::ifstream in( "db.data", std::ios::in );
if ( !in )
{
   std::cerr << "File could not be opened." << std::endl;
} 
in.read( reinterpret_cast< char * >( &ac ), sizeof( ac ) );