我有一个包含这种格式的游戏高分的文本文件:
Name Score
Name Score
Name Score
文件按分数降序排列。
我想在文件的正确位置插入一个新名称及其相应的分数,以便它保持正确排序。任何有关如何执行此操作的建议都将不胜感激!
例如,给定以下文件:
Edward 100
David 90
Sarah 80
Alice 60
还有我要补充的。
Name = Jodi
Score = 70
到文件,所以新文件内容为:
Edward 100
David 90
Sarah 80
Jodi 70
Alice 60
谢谢
目前我有以下代码:
string playerName = pPlayer->GetName();
int playerScore = pPlayer->GetScore();
std::ofstream score("scores.txt", std::ios_base::app | std::ios_base::out);
score << "\n" << playerName << " " << playerScore;
这只是将名称添加到文件末尾。我考虑过阅读整个文件,然后对旧文件进行排序。但我不想这样做,因为如果文件变大,可能需要很长时间。
最佳答案
有几种不同的方法可以做到这一点。最简单的实现方式是将整个文件读入 vector ,插入新值并写出新文件。
第二个选项是读取文件直到找到正确的位置,“标记”文件中的位置(例如使用 istream::tellg()
),然后读取所有文件将以下元素放入 vector 中,更新新记录,然后写回超出该记录的一次。
第三种选择是只在文件中保持列表无序,并在您阅读时对信息进行排序。这样,您可以只追加到末尾,从而节省了一遍又一遍地写入文件的时间。
实际上,我怀疑写一个非常大的文件仍然足够快,几乎没有或根本没有影响。现代硬盘驱动器每秒写入数兆字节,而每行只有几十个字节,因此您的文件中需要有数百万行才能产生任何影响。例如,我刚刚在我的机器上复制了一些132MB的大文件,读写132mb的复合时间为1.2s。如果你的每条记录都是 26 个字节,那就是 5000 万个“分数”。
关于C++在文件中的特定点插入一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22873898/