【发布时间】: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