尝试 file.read() 到新变量时程序停止工作
Program stopped working when trying to file.read() to a new variable
好的,所以我有了这段代码,我只想将我的结构写入文件,然后使用另一个变量读取,因为我想在读取时 return 一个 userRankings 向量。
这是我的 write/read
void IOManager::WriteBin(const string &filename, userRank u1) {
ofstream fsalida(filename, ios::out | ios::binary); //obrim un archiu per escriure en binari i de tipo append per poder escriure al final i no xafar-ho tot cada cop
if (fsalida.is_open())
{
fsalida.write(reinterpret_cast<char*>(&u1), sizeof(u1));
fsalida.close();
}
else cout << "Unable to open file for writing\n";
}
void IOManager::ReadBin(const string &filename) {
ifstream fentrada(filename, ios::in | ios::binary); //ate per posarnos al final del archiu i tenir el tamany
if (fentrada.is_open())
{
userRank tempUser;
fentrada.read(reinterpret_cast<char*>(&tempUser), sizeof(tempUser));
fentrada.close();
cout << sizeof(tempUser) << endl;
}
else cout << "Unable to open file for reading\n";
}
我的用户等级:
struct userRank
{
std::string userName;
int score;
};
失败的行是 fentrada.read(reinterpret_cast(&tempUser), sizeof(tempUser));
请帮忙,这似乎适用于整数、字符等,但不适用于字符串和复杂类型,有人知道为什么吗?
以这种方式使用 reinterpret_cast
是危险的,并且由于多种原因可能会中断。在这种特殊情况下,它不起作用的原因是因为 struct userRank
包含 std::string
而不是 a POD type (普通旧数据类型)。这意味着您不能简单地设置它的位并期望获得正确的状态。 std::string
包含指向已分配内存的指针。设置 std::string
的位不会分配它期望在该指针地址找到的内存。
快速修复(相对而言)是使用 std::array
而不是 std::string
来存储 userName
。正确的解决方法是编写将 read/write 结构的状态 to/from 逐个成员的文件成员的函数。
好的,所以我有了这段代码,我只想将我的结构写入文件,然后使用另一个变量读取,因为我想在读取时 return 一个 userRankings 向量。
这是我的 write/read
void IOManager::WriteBin(const string &filename, userRank u1) {
ofstream fsalida(filename, ios::out | ios::binary); //obrim un archiu per escriure en binari i de tipo append per poder escriure al final i no xafar-ho tot cada cop
if (fsalida.is_open())
{
fsalida.write(reinterpret_cast<char*>(&u1), sizeof(u1));
fsalida.close();
}
else cout << "Unable to open file for writing\n";
}
void IOManager::ReadBin(const string &filename) {
ifstream fentrada(filename, ios::in | ios::binary); //ate per posarnos al final del archiu i tenir el tamany
if (fentrada.is_open())
{
userRank tempUser;
fentrada.read(reinterpret_cast<char*>(&tempUser), sizeof(tempUser));
fentrada.close();
cout << sizeof(tempUser) << endl;
}
else cout << "Unable to open file for reading\n";
}
我的用户等级:
struct userRank
{
std::string userName;
int score;
};
失败的行是 fentrada.read(reinterpret_cast(&tempUser), sizeof(tempUser));
请帮忙,这似乎适用于整数、字符等,但不适用于字符串和复杂类型,有人知道为什么吗?
以这种方式使用 reinterpret_cast
是危险的,并且由于多种原因可能会中断。在这种特殊情况下,它不起作用的原因是因为 struct userRank
包含 std::string
而不是 a POD type (普通旧数据类型)。这意味着您不能简单地设置它的位并期望获得正确的状态。 std::string
包含指向已分配内存的指针。设置 std::string
的位不会分配它期望在该指针地址找到的内存。
快速修复(相对而言)是使用 std::array
而不是 std::string
来存储 userName
。正确的解决方法是编写将 read/write 结构的状态 to/from 逐个成员的文件成员的函数。