正在写入的单个实例
A
二进制文件很简单,因为它是POD类型:
std::ofstream outfile = {...};
A a = { ... };
outfile.write(reinterpret_cast<char const*>(&a), sizeof(a));
编写的单个实例
B
,OTOH,不是那么简单。你得写信
n1
首先是数组中的元素,然后是数组中的元素。
B b = { ... };
outfile.write(reinterpret_cast<char const*>(&b.n1), sizeof(b.n1));
outfile.write(reinterpret_cast<char const*>(b.array), sizeof(A)*b.n1);
显然,从二进制文件读取是相反的。正在读取的实例
A.
很简单。
std:ifstream infile = { ... };
A a;
infile.read(retinterpret_cast<char*>(&a), sizeof(a));
正在读取的实例
B
有点复杂。您必须先读取大小,然后为数组的元素分配内存,然后读取数组的元素。
B b;
infile.read(retinterpret_cast<char*>(&b.n1), sizeof(b.n1));
b.array = new A[b.n1];
infile.read(retinterpret_cast<char*>(b.array), sizeof(A)*b.n1);
您可以通过使用助手函数来简化其中一些代码,从而减少
retinterpret_cast
所有代码。
namespace MyApp
{
template <typename T>
std::ostream& write(std::ostream& out, T const& pod)
{
out.write(reinterpret_cast<char const*>(&pod), sizeof(T));
return out;
}
template <typename T>
std::ostream& write(std::ostream& out, T* array, int numElements)
{
out.write(reinterpret_cast<char const*>(array), sizeof(T)*numElements);
return out;
}
template <typename T>
std:istream read(std::istream& in, T& pod)
{
in.read(reinterpret_cast<char*>(&pod), sizeof(T));
return in;
}
template <typename T>
std:istream& read(std:istream& in, T* array, int numElements)
{
in.read(reinterpret_cast<char*>(array), sizeof(T)*numElements);
return in;
}
}
现在,您可以使用:
MyApp::write(outfile, a);
MyApp::read(infile, a);
MyApp::write(outfile, b.n1);
MyApp::write(outfile, b.array, b.n1);
MyApp::write(infile, b.n1);
b.array = new A[b.n1];
MyApp::write(infile, b.array, b.n1);