c ++将带有std::string的结构数组读写到二进制文件中
c++ read and write struct array with std::string into binary file
我是 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
的类型)和后续循环 return 我是垃圾。
提前致谢!
问题出在这一行
file.write(orgs[i].name.data(), sizeof(sz));
这里打错了,改用
file.write(orgs[i].name.data(), sz);
你应该写 sz 字节,而不是 sizeof(sz)。您的代码还有一个问题。您将读取最后一条记录两次,因为 file.good() 将在最后一条记录之后 return 为真。你可以这样读:
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;
}
我是 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
的类型)和后续循环 return 我是垃圾。
提前致谢!
问题出在这一行
file.write(orgs[i].name.data(), sizeof(sz));
这里打错了,改用
file.write(orgs[i].name.data(), sz);
你应该写 sz 字节,而不是 sizeof(sz)。您的代码还有一个问题。您将读取最后一条记录两次,因为 file.good() 将在最后一条记录之后 return 为真。你可以这样读:
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;
}