C++ 在文件中的特定点插入一行

ste*_*315 6 c++ string file-io

我有一个文本文件,其中包含以下格式的游戏高分:

Name Score
Name Score
Name Score
Run Code Online (Sandbox Code Playgroud)

文件按分数降序排列。

我想在文件中的正确位置插入一个新名称及其相应的分数,以便它保持正确的顺序。任何如何做到这一点的建议将不胜感激!

例如,给定以下文件:

Edward 100
David 90
Sarah 80
Alice 60
Run Code Online (Sandbox Code Playgroud)

我想补充一下。

Name = Jodi
Score = 70
Run Code Online (Sandbox Code Playgroud)

到文件,所以新文件读取:

Edward 100
David 90
Sarah 80
Jodi 70
Alice 60
Run Code Online (Sandbox Code Playgroud)

谢谢

目前我有以下代码:

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;
Run Code Online (Sandbox Code Playgroud)

这只是将名称添加到文件末尾。我考虑阅读整个文件并对其进行排序,然后对旧文件进行纠正。但我不想这样做,因为如果文件变大,可能需要很长时间。

Mat*_*son 5

有几种不同的方法可以做到这一点。最简单的实现是将整个文件读入向量,插入新值并写出新文件。

第二种选择是读取文件,直到找到正确的位置,“标记”文件中的位置(例如使用istream::tellg()),然后将以下所有元素读入向量,更新新记录,并写回一旦超出这个范围。

第三种选择是仅使文件中的列表保持无序,并在阅读时对信息进行排序。这样,您只需追加到末尾即可,从而节省了一遍又一遍地写入文件的时间。

事实上,我怀疑写入一个非常大的文件仍然足够快,几乎没有什么区别。现代硬盘驱动器每秒写入许多兆字节,而每行只有几十个字节,因此文件中需要有数百万行才能产生任何影响。例如,我刚刚在我的机器上复制了一些132MB的大文件,读取和写入132MB的综合时间为1.2s。如果每条记录都是 26 字节,那就是 5000 万个“分数”。