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

标签 c++ string file-io

我有一个包含这种格式的游戏高分的文本文件:

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/

相关文章:

c++ - 影响自动类型推导

c++ - 有什么简单的方法可以检查两个数字是否有不同的符号?

java - 如何使用字符串的 split 方法验证日期?

c++ - 可移植 VFS 库 C++

c - 读取像 1,2,3,4 这样的行时如何在 c 中正确 fscanf?

c++ - 模板特化 GCC 的语法错误,但不是 MSVC

c++ - WaitForSingleObject 不等待进程结束

c# - 我将如何跳过 foreach 循环中的空格?

c# - 在 C# 中查找匹配的单词

c - 多个进程,一个互斥锁