C++ c++;当我读取二进制文件时,会得到重复的信息

C++ c++;当我读取二进制文件时,会得到重复的信息,c++,vector,ifstream,ofstream,C++,Vector,Ifstream,Ofstream,我写了一个3号的向量,当我读的时候,我得到了一个4号的向量,最后一个索引是索引2的副本 这是我的密码 void IOManager::WriteBin(const string &filename, vector<userRank> highScorers, int rank) { ofstream fsalida(filename, ios::out | ios::binary); if (fsalida.is_open()) {

我写了一个3号的向量,当我读的时候,我得到了一个4号的向量,最后一个索引是索引2的副本

这是我的密码

void IOManager::WriteBin(const string &filename, vector<userRank> highScorers, int rank) {

    ofstream fsalida(filename, ios::out | ios::binary); 

    if (fsalida.is_open())
    {
        for (int i = 0; i < highScorers.size();i++) {
            fsalida.write(reinterpret_cast<char*>(&highScorers[i]), sizeof(highScorers[i]));

        }
        //highScorers.size() is 3
        fsalida.close();      

    }else cout << "Unable to open file for writing\n";
}

vector<userRank> IOManager::ReadBin(const string &filename) {

    ifstream fentrada(filename, ios::in | ios::binary); 

    if (fentrada.is_open())
    {

        vector<userRank>bestPlayers;

        for (int i = 0; fentrada.good(); i++) {
            userRank tempUser;
            fentrada.read(reinterpret_cast<char*>(&tempUser), sizeof(tempUser));
            bestPlayers.push_back(tempUser);

        }
        //bestPlayers.size() is 4!!!!!! Im losing my mind
        fentrada.close();

        return bestPlayers;

    }
    else cout << "Unable to open file for reading\n";   

}

出于某种原因出现了一个疯狂的userRank,有人知道为什么吗?

我建议重新组织read函数:

userRank tempUser;
for (int i = 0;
     fentrada.read(reinterpret_cast<char*>(&tempUser), sizeof(tempUser));
     i++)
{
    bestPlayers.push_back(tempUser);
}
userRank-tempUser;
对于(int i=0;
fentrada.read(重新解释演员阵容和临时用户),sizeof(临时用户));
(i++)
{
最佳球员。推回(临时用户);
}

搜索Internet“StasObjultC++ +为什么EOF在坏的时候”。 我建议重新组织read函数:

userRank tempUser;
for (int i = 0;
     fentrada.read(reinterpret_cast<char*>(&tempUser), sizeof(tempUser));
     i++)
{
    bestPlayers.push_back(tempUser);
}
userRank-tempUser;
对于(int i=0;
fentrada.read(重新解释演员阵容和临时用户),sizeof(临时用户));
(i++)
{
最佳球员。推回(临时用户);
}

搜索Internet“StasObjultC++ +为什么EOF在坏的时候”。 我不知道你到底想要什么。你没有发布我理解你的代码所需的所有信息。但是我猜你应该读一下:。这不是问题,但是不需要调用

fsalida.close()
fentrada.close()
。流的析构函数将关闭文件。在第一个循环中,可以保证您正在写入
highScorers.size()
项,但在读取循环中,您将根据流标志的条件进行循环。为什么不做一个实验,读取与您用项目数硬编码第二个循环相同数量的数据。顺便说一句,当文件未打开时,
ReadBin
方法仍然需要返回一个值。所有返回路径都需要返回一个值。应该有一些返回给调用方的指示,表明函数失败。这是因为您没有在读取之后进行检查,以确保它确实能够读取。由于它无法进一步读取数据,因此没有将数据放入分配给tempUser的内存中,它使用了相同的局部变量,因此内存不会被释放,并将旧值推送到向量上。你必须先检查读取的结果,然后再尝试推到向量上,尤其是在读取流时。我不确定你到底想要什么。你没有发布我理解你的代码所需的所有信息。但是我猜你应该读一下:。这不是问题,但是不需要调用
fsalida.close()
fentrada.close()
。流的析构函数将关闭文件。在第一个循环中,可以保证您正在写入
highScorers.size()
项,但在读取循环中,您将根据流标志的条件进行循环。为什么不做一个实验,读取与您用项目数硬编码第二个循环相同数量的数据。顺便说一句,当文件未打开时,
ReadBin
方法仍然需要返回一个值。所有返回路径都需要返回一个值。应该有一些返回给调用方的指示,表明函数失败。这是因为您没有在读取之后进行检查,以确保它确实能够读取。由于它无法进一步读取数据,因此没有将数据放入分配给tempUser的内存中,它使用了相同的局部变量,因此内存不会被释放,并将旧值推送到向量上。你必须先检查读取的结果,然后再尝试推送向量,尤其是在读取流时。Thaks!我的问题是@MiltoxBeyond在说什么,最后一次阅读没有成功。Thaks!我的问题是@MiltoxBeyond在说什么,最后一次阅读没有成功。