我需要创建一个二进制文件并写入所创建的结构的当前状态。
这个结构有另一个结构。 像这样:
struct A {
bool flag=true;
int n;
};
struct B
{
int n1;
A *array;
};
如何在二进制文件中写入所有内容?
但特别是如何从二进制文件中读取并再次加载struct B
中的所有内容,然后在A *array
中加载所有内容。
非常感谢。
我试过这种方式,但有时会给我一个例外并阻止所有 (违反读取权限)。
如何写:
ofstream save("binary.bin", ios::binary);
if (!save) {
cerr << "Error creation file ";
}
else {
save.write(reinterpret_cast<char*>(&prova), sizeof(prova));
}
binary.close();
如何阅读和打印:
save.read(reinterpret_cast<char*>(&prova), sizeof(prova));
for (size_t i = 0; i != try.n1; ++i)
{
cout << "....." << try.n1 <<endl;
cout << "..... "<< try.array[i].n <<" ";
cout << ".....: "<<try.array[i].flag<< endl;
}
答案 0 :(得分:1)
在二进制文件中写入A
的单个实例很简单,因为它是一个POD类型:
std::ofstream outfile = {...};
A a = { ... };
outfile.write(reinterpret_cast<char const*>(&a), sizeof(a));
写一个B
,OTOH的单个实例并不那么简单。您必须首先编写n1
,然后编写数组中的元素。
B b = { ... };
// Write the number of elements first.
outfile.write(reinterpret_cast<char const*>(&b.n1), sizeof(b.n1));
// Now write the elements.
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;
// Read the number of elements
infile.read(retinterpret_cast<char*>(&b.n1), sizeof(b.n1));
// Allocate memory for the elements of the array.
b.array = new A[b.n1];
// Now read the elements of the array.
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;
}
}
现在,您可以使用:
// Write a
MyApp::write(outfile, a);
// Read a
MyApp::read(infile, a);
// Write b
MyApp::write(outfile, b.n1);
MyApp::write(outfile, b.array, b.n1);
// Read b
MyApp::write(infile, b.n1);
b.array = new A[b.n1];
MyApp::write(infile, b.array, b.n1);