如何将字符串作为二进制文件写入文件?

时间:2009-09-04 09:37:37

标签: c++

这是一个C ++问题。我有一个包含字符串的类:

class MyClass{
public:
std::string s;
};

我有一个MyClass对象数组:

MyClass * array = MyClass[3];

现在我想将数组作为二进制文件写入文件中。我不能用:

Ofstream.write((char *)array, 3 * sizeof(MyClass))

因为MyClass的大小不一。

如何使用Ofstream.write实现此目的?非常感谢。

6 个答案:

答案 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 );