C++中使用fstream读取对象

3

我正在尝试使用fstream将对象写入文件并在读取后显示在屏幕上,但是当我尝试使用cout显示读取的对象时,出现错误消息Segmentation fault: 11。有人能帮我解决这个代码问题吗?谢谢!

Produto *p1 = new Produto(1, "Refrigerante");

cout << "Produto p1 (pre serializacao): (" << p1->codigo << ") " << p1->descricao << endl;

ofstream serializationWriter;
serializationWriter.open("myobject.dat", ios::binary);
serializationWriter.write((char *)&p1, sizeof(p1));

Produto *p2;

ifstream serializationReader;
serializationReader.open("myobject.dat", ios::binary);
serializationReader.read((char *)&p2, sizeof(p2));

cout << "Produto p2 (pos serializacao): (" << p2->codigo << ") " << p2->descricao << endl;

1
使用Boost序列化!它超级棒:http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/index.html - Fantastic Mr Fox
&p2 是一个指向指针的指针,即 Produto**。你可能想将 p2 声明为一个实例,例如 Produto p2 - David G
write 之后,你不也需要关闭文件吗? - vsoftco
1
serializationWriter.write((char *)&p1, sizeof(p1)); 这个变量名字起得不太准确。你并没有“序列化”数据——你所做的只是将一堆字节写入文件。你不能用这种方式序列化非 POD 对象。 - PaulMcKenzie
1
@PaulMcKenzie,情况更糟。他只是写入文件的指针,并将指针的相同数值读入p2中。 - R Sahu
显示剩余2条评论
1个回答

2
您需要为类“Produto”提供一些序列化机制。例如:
class Produto {
  // ...
private: 
  std::string m_str;
private: 
  friend ostream& operator<<(ostream& stream, const Produto& obj);
  friend istream& operator>>(istream& stream, Prodoto& obj)
};

ostream& operator<<(ostream& stream, const Produto& obj)
{
  // Write all data to stream.
  // ...
  stream << obj.m_str;
  return stream;
}

istream& operator>>(istream& stream, Prodoto& obj)
{
  // Read all data from strem.
  // ...
  stream >> obj.m_str;
  return stream; 
}

然后按照以下方式使用:

Produto p1(1, "Refrigerante");
ofstream serializationWriter;
// ...
serializationWriter << p1;

Produto p2;
ifstream serializationReader;
// ...
serializationReader >> p2;

了解更多详情,请参见重载输出和输入运算符


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接