繁体   English   中英

在C ++中的二进制文件中发出结构的读/写数组

[英]Issue Read/Write array of structure in binary file in c++

我想将我的数组结构写入二进制文件。

我的结构

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;
}

对我来说,使用向量似乎构成了问题,如果将两者结合在一个程序中就可以很好地工作,我想是因为向量保存在内存中,因此仍然可以访问。

有什么建议么?

您不能像这样序列化一个向量。 writeread功能直接访问给定地址的内存。 由于vector是复杂的类类型,因此仅将其数据内容的一部分顺序存储在其基地址中。 其他部分(堆分配的内存等)位于其他位置。 最简单的解决方案是将向量的长度写在文件中,然后是每个值。 您必须遍历矢量元素以完成此操作。

outbal.write((char *)&stu, sizeof(stu));

sizeof是一个编译时常量。 换句话说,它永远不会改变。 如果向量包含1、10、1000或1,000,000个项目,则将相同数量的字节写入文件。 因此,这种写入文件的方式是完全错误的。

那你写的结构是non-POD由于vector是一个非POD类型。 这意味着您不能仅仅将其视为可以从中复制或复制到的一组字节。 如果需要进一步的证明,请打开在任何编辑器中创建的文件。 您可以从该文件中的向量中看到数据吗? 您将看到的很有可能是乱码。

要将数据写入文件,您必须正确地序列化数据,这意味着您必须将数据写入文件,而不是struct本身。 您以某种方式写入数据,以便在回读数据时可以重新创建该结构。 最终,这意味着您必须

  1. 将名称写入文件,以及名称可能包含的字节数。
  2. 写出向量中的项目数
  3. 将每个矢量项目写入文件。

如果不是这样,则可以通过某种方式从文件中清楚地找出名称和向量的数据,以便您读取代码的代码可以正确解析文件并重新创建结构。

二进制文件的格式是什么? 基本上,您必须定义格式,然后将每个元素与该格式进行相互转换。 您永远不能只将内部表示形式的位转储到磁盘上并期望能够将其读回。 (事实上​​,您需要一个reinterpret_cast来在对象上调用ostream::write可以告诉您一些信息。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM