我想将我的数组结构写入二进制文件。
我的结构
typedef struct student{
char name[15];
vector<int> grade;
}arr_stu;
如果我在同一个程序中写入和读取,我可以写入和读回我的数据;但是如果我只为读取数据创建另一个程序并放入二进制文件,则它不起作用,因为矢量等级为空。
size = 0;
unable to read from memory
将数组结构写入文件的程序
int main()
{
arr_stu stu[100];
for (size_t i = 0; i < 100; i++)
{
strcpy(stu[i].name, randomName());
for (size_t j = 0; j < 10; j++)
{
stu[i].grade.push_back(randomGrade());
}
}
ofstream outbal("class", ios::out | ios::binary);
if (!outbal) {
cout << "Cannot open file.\n";
return 1;
}
outbal.write((char *)&stu, sizeof(stu));
outbal.close();
}
将数组结构读入文件的程序
int main(){
feature_struc stu[100];
ifstream inbal("class", ios::in | ios::binary);
if (!inbal) {
cout << "Cannot open file.\n";
return 1;
}
inbal.read((char *)&stu, sizeof(stu));
for (size_t idx = 0; idx < 100; idx++)
{
cout << "Name : " << stu[idx].name << endl;
for (size_t index = 0; index < 10; index++)
{
cout << endl << "test: " << stu[idx].grade[index] << endl;
}
}
inbal.close();
return 0;
}
对我而言,似乎使用向量会造成问题, 我们认为,如果我们将两者结合在一个程序中,我认为因为矢量被保存在内存中,因此它仍然可以访问。
有什么建议吗?
答案 0 :(得分:4)
您无法像这样序列化矢量。 write
和read
函数直接访问给定地址的内存。由于vector
是一个复杂的类类型,因此只有部分数据内容按顺序存储在其基址中。其他部分(堆分配的内存等)位于其他地方。最简单的解决方案是将向量的长度写入文件,然后是每个值。你必须循环遍历矢量元素才能完成它。
答案 1 :(得分:1)
outbal.write((char *)&stu, sizeof(stu));
sizeof
是编译时常量。换句话说,它永远不会改变。如果向量包含1个,10个,1000个或1,000,000个项,则您将相同的字节数写入文件。所以这种写入文件的方式是完全错误的。
由于non-POD
是非POD类型,您正在编写的结构为vector
。这意味着您不能将其视为可以从中复制或从中复制的一组字节。如果需要进一步校对,请打开在任何编辑器中创建的文件。你能看到该文件中矢量的数据吗?你会看到的很可能是胡言乱语。
要将数据写入文件,您必须正确序列化数据,这意味着您必须将数据写入文件,而不是struct
本身。您以某种方式编写数据,以便在读取数据时,可以重新创建结构。最终,这意味着你必须
如果不是这样,那么你可以从某种方式明确地从文件中找出名称和向量的数据,以便你的代码读取数据正确地解析文件并重新创建结构。
答案 2 :(得分:0)
二进制文件的格式是什么?基本上,你必须
定义格式,然后将每个元素转换为
那种格式。你永远不能只是转储内部的一些东西
表示磁盘并期望能够读回来。
(事实上你需要reinterpret_cast
来打电话
你对象的ostream::write
应该告诉你一些事情。)