【问题标题】:c++ i get duplicated info when i read a binary filec++ 当我读取二进制文件时,我得到了重复的信息
【发布时间】:2017-01-05 16:55:10
【问题描述】:

我正在编写一个大小为 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 结构

struct userRank
{
    char userName [5];
    int score;  
};

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

【问题讨论】:

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

标签: c++ vector ifstream ofstream


【解决方案1】:

我建议重新组织读取功能:

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

在互联网上搜索“stackoverflow c++ 为什么 eof in while 不好”。

【讨论】:

  • 谢谢!我遇到的问题是@MiltoxBeyond 所说的,最后一次阅读没有成功。
猜你喜欢
  • 2012-08-19
  • 2013-02-02
  • 2015-12-11
  • 1970-01-01
  • 2019-05-13
  • 2017-10-18
  • 2020-11-16
  • 2018-11-30
  • 2023-03-13
相关资源
最近更新 更多