尝试 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 逐个成员的文件成员的函数。