如何将字符串作为二进制文件写入文件? 这是一个C++问题。我有一个包含字符串的类: class MyClass{ public: std::string s; };

如何将字符串作为二进制文件写入文件? 这是一个C++问题。我有一个包含字符串的类: class MyClass{ public: std::string s; };,c++,C++,我有一个MyClass对象数组: MyClass * array = MyClass[3]; 现在我想将数组作为二进制文件写入一个文件。我不能使用: Ofstream.write((char *)array, 3 * sizeof(MyClass)) 因为MyClass的大小不同 如何使用Ofstream.write来实现此目的?非常感谢。以二进制模式打开流: std::fstream filestream( "file.name", std::ios::out | std::ios::bi

我有一个MyClass对象数组:

MyClass * array = MyClass[3];
现在我想将数组作为二进制文件写入一个文件。我不能使用:

Ofstream.write((char *)array, 3 * sizeof(MyClass))
因为MyClass的大小不同


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

以二进制模式打开流:

std::fstream filestream( "file.name", std::ios::out | std::ios::binary );
为MyClass编写一个,比如,将其成员逐个写入流。然后创建一个遍历数组的循环,将每个成员写入流。还记得在某个时候写出数组的大小,这样当您读回文件时就知道要读取多少个成员


和Klaim所说的,确保你以二进制模式打开流。

< P>一个好方法是在C++中重写<代码> < p>它通常使用

通过编程,您可以执行以下操作:

写作:

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::of stream ostream(“myclass.bin”,std::ios::binary); 如果(!ostream)返回;//错误! std::size\u t数组\u size=3; write(reinterpret_cast(&array_size),sizeof(std::size_t)); for(MyClass*it=array;it!=array+array\u size;+it) { MyClass&mc=*it; std::size_t s=mc.s.size(); write(reinterpret_cast&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 std::ifstream istream(“myclass.bin”,std::ios::binary); 如果(!istream)返回;//错误! std::size\u t数组\u size=0; 读取(重新解释强制转换(&数组大小),sizeof(std::size\t)); 数组=新的MyClass[数组大小]; for(MyClass*it=array;it!=array+array\u size;+it) { MyClass&mc=*it; 标准:尺寸; istream.read(重新解释铸件(&s),sizeof(标准::尺寸t)); mc.调整大小; istream.read(mc.s.c_str(),s.size()); } istream.close();//不需要,因为由于范围的原因,应该神奇地关闭
重载
operator您到底想向文件写入什么?在C++中,你不能对对象的内容做出假设,比如在C.STD:可以这样做:String通常保存指针、分配器、字符串长度和/或前几个字符。它肯定不会保存从string::data()获得的整个字符[]。如果您有一个std::string[3],三个sring::data()数组(几乎可以肯定)将是非连续的,因此您将需要三次写入-每个调用只能写入一个连续数组。

“对于mc:0…数组大小”是伪代码、C++0x还是键入错误?考虑到两个示例的语法不同,必须是伪代码。我认为伪代码会更好,因为它更一般,虽然我已经把它改回了更具体的C++。 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
ostream& operator<< (ostream& os, const MyClass& mc)
{
  return os << mc.s /* << ... other members*/ << endl;
}