c ++使用std :: string读取和写入struct数组到二进制文件中

时间:2015-05-06 08:38:35

标签: c++ serialization struct fstream

我对c ++很新(问题是我作业的一部分)。

我需要在二进制文件中存储一个结构数组并将其读回。问题是我的结构包含std::string字段。另一方面,我可以读取字符串,但没有任何内容。这是我的结构定义:

struct Organization {
int id;
string name;
float paidTaxes;
};

以下是我将此结构的数组写入文件的代码:

void writeToFile(Organization *orgs, int n) {
ofstream file("orgs.bin", ios::out | ios::binary);
if (!file) { return; }
for (int i = 0; i < n; i++) {
    // determine the size of the string
    string::size_type sz = orgs[i].name.size();
    file.write(reinterpret_cast<char*>(&orgs[i].id), sizeof(int));
    // write string size
    file.write(reinterpret_cast<char*>(&sz), sizeof(string::size_type));
    // and actual string
    file.write(orgs[i].name.data(), sizeof(sz));
    file.write(reinterpret_cast<char*>(&orgs[i].paidTaxes), sizeof(float));
}
file.close();

}

以下是我正在阅读此文件的代码部分:

count = 0;
Organization org;
ifstream file;
file.open("orgs.bin", ios::binary);
while (file.good()) {
    string::size_type sz;
    file.read(reinterpret_cast<char*>(&org.id), sizeof(int));
    file.read(reinterpret_cast<char*>(&sz), sizeof(string::size_type));
    org.name.resize(sz);
    file.read(&org.name[0], sz);
    file.read(reinterpret_cast<char*>(&org.paidTaxes), sizeof(float));
    count++;
}

据我了解,我需要运行此循环来确定文件中存储了多少个结构。当我运行调试器时,我成功读取了id字段,字符串大小和实际字符串。但是,我从来没有得到正确的paidTaxes字段(类型为float),后续循环返回垃圾邮件。

提前感谢!

1 个答案:

答案 0 :(得分:1)

问题出在这一行

file.write(orgs[i].name.data(), sizeof(sz));

这是一个错字,使用

file.write(orgs[i].name.data(), sz);

你应该写sz字节,但不是sizeof(sz)。您的代码还有一个问题。您将两次读取最后一条记录,因为file.good()将在最后一条记录后返回true。你可以这样读:

    while (file.good()) {
    string::size_type sz;
    if( !file.read(reinterpret_cast<char*>(&org.id), sizeof(int)) )
        break;
    file.read(reinterpret_cast<char*>(&sz), sizeof(string::size_type));
    org.name.resize(sz);
    file.read(&org.name[0], sz);
    file.read(reinterpret_cast<char*>(&org.paidTaxes), sizeof(float));
    count++;

    std::cout << org.id << " " << org.name << " " << org.paidTaxes << std::endl;
}