这是一个C ++问题。我有一个包含字符串的类:
class MyClass{
public:
std::string s;
};
我有一个MyClass对象数组:
MyClass * array = MyClass[3];
现在我想将数组作为二进制文件写入文件中。我不能用:
Ofstream.write((char *)array, 3 * sizeof(MyClass))
因为MyClass的大小不一。
如何使用Ofstream.write实现此目的?非常感谢。
答案 0 :(得分:4)
在C ++中,通常使用BOOST serialization class
完成以编程方式,您可以执行以下操作:
写作:
std::ofstream ostream("myclass.bin",std::ios::binary); if (!ostream) return; // error! std::size_t array_size = 3; ostream.write(reinterpret_cast<char*>(&array_size),sizeof(std::size_t)); for(MyClass* it = array; it != array + array_size; ++it) { MyClass& mc = *it; std::size_t s = mc.s.size(); ostream.write(reinterpret_cast<char*>(&s),sizeof(std::size_t)); ostream.write(mc.s.c_str(),s.size()); }
阅读
std::ifstream istream("myclass.bin",std::ios::binary); if (!istream) return; // error! std::size_t array_size = 0; istream.read(reinterpret_cast<char*>(&array_size),sizeof(std::size_t)); array = new MyClass[array_size]; for(MyClass* it = array; it != array + array_size; ++it) { MyClass& mc = *it; std::size_t s; istream.read(reinterpret_cast<char*>(&s),sizeof(std::size_t)); mc.resize(s); istream.read(mc.s.c_str(),s.size()); } istream.close(); // not needed as should close magically due to scope
答案 1 :(得分:4)
为您的班级重载operator<<
。你可以这样做:
ostream& operator<< (ostream& os, const MyClass& mc)
{
return os << mc.s /* << ... other members*/ << endl;
}
答案 2 :(得分:1)
为MyClass写一个insertion operator,如this,将其成员逐个写入流中。然后创建一个循环来遍历数组,将每个成员写入流。记得在某些时候写出数组大小,这样你就知道在读回文件时要读取多少成员。
而且,正如Klaim所说,请确保以二进制模式打开流。
答案 3 :(得分:1)
这样做的好方法是覆盖<<
的{{1}}运算符:
MyClass
然后,您可以直接将MyClass中的字符串直接序列化到文件流中:
ostream& operator << (ostream& output, const MyClass& myClass)
{
return output << myClass.Value;
}
答案 4 :(得分:1)
您想要写入文件到底是什么?在C ++中,您不能像在C中那样对对象的内容做出假设。例如,std :: string通常包含指针,分配器,字符串长度和/或前几个字符。它肯定不会保存你从string :: data()获得的整个char []。如果你有一个std :: string [3],那么三个sring :: data()数组(几乎可以肯定)是非连续的,所以你需要三次写入 - 每次调用只能写一个连续的数组。
答案 5 :(得分:-1)
以二进制模式打开流:
std::fstream filestream( "file.name", std::ios::out | std::ios::binary );