尝试将file.read()转换为新变量时,程序停止工作

时间:2017-01-04 17:52:06

标签: c++ ifstream ofstream

好的,所以我有这个代码我只是想把我的结构写到文件然后使用另一个变量读取,因为我想在阅读时返回userRankings的向量。

这是我的写/读

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

}

我的userRank:

struct userRank
{
    std::string userName;
    int score;
};

失败的行是fentrada.read(reinterpret_cast(&amp; tempUser),sizeof(tempUser));

请帮助,这似乎适用于整数,字符等,但不适用于字符串和复杂类型,有人知道为什么吗?

1 个答案:

答案 0 :(得分:0)

以这种方式使用reinterpret_cast是危险的,并且可能由于多种原因而中断。在这种特殊情况下,它不起作用的原因是因为struct userRank包含std::string而不是a POD type(普通旧数据类型)。这意味着你不能简单地设置它的位并期望获得正确的状态。 std::string包含指向已分配内存的指针。设置std::string的位不会分配它希望在该指针的地址处找到的内存。

快速修复(相对而言)是使用std::array代替std::string来存储userName。正确的解决方法是编写将按成员向/从文件成员读取/写入结构状态的函数。