如何用c++中的控制台替换txt文件中的一行

How do I replace a line in a txt file with console in c++?

本文关键字:一行 文件 替换 何用 c++ 控制台 txt      更新时间:2023-10-16

我想为win32主机游戏取得高分。高分文本文件将有10行,供有史以来最优秀的10个人使用。我一直在使用http://www.cplusplus.com/doc/tutorial/files/.如果你向下滚动到文本文件,我已经在一个项目中使用了这两个例子。

此外,是否可以让应用程序自动读取文件,看看分数是否在前10名?并自动从上到下从最高到最低对前十名进行排序?

我使用的是visual c++express 2010

获取包含当前高分的向量,将新的分数添加到其中,根据分数排序,然后有一个打印函数,该函数在排序后的向量中从0到9迭代,并将每个向量作为一行写入文件。每次更换它(如果只有10行)并不是什么大不了的事。

下面是我要做的事情的大致概述:

I。按照示例中的内容阅读高分文件。将这些值放在包含分数和玩家名称的类向量中。也许可以使用类似的类

class MyData
{
public:
  int m_iData;
  string m_strSomeOtherData;
};

II。对矢量进行排序。看见http://www.codeguru.com/forum/showthread.php?t=366064

III。如果新的分数高于排序向量中的最低分数,请将其添加到向量中,重新排序向量,并将前10个分数写入高分文件,如示例所示。

线路长度是固定的吗?如果是,您可以查找文件中的正确位置,然后只写新行。

如果没有:写一个新的。你必须一行一行地读旧的。如果您刚读取的行是要替换的行,请将新的行写入新文件。如果不是,只需将行不更改地写入新文件即可。完成后,删除旧文件并将新文件重命名为旧文件的名称。

由于您只有一个文件,而且它只包含高分数据,所以我不会担心文件访问速度。这个文件将很小。

相反,在阅读时,只需加载整个文件,对其进行排序,并截断除前10名外的所有分数。你可以用

std::vector<Score> result;
std::fstream file;
file.open(filename, std::ios::in);
std::vector<std::string> lines;
std::string line;
while(std::getline(file, line))
  lines.push_back(line);
for(size_t i = 0; i < lines.size(); ++i)
{
  const std::string& line(lines[i]);
  std::istringstream iss(line);
  Score score;
  if(!(iss >> score))
    throw new std::runtime_error("failed to convert to score: " + line);
  result.push_back(score);
}
std::sort(result.begin(), result.end(), isScoreGreater);
if(result.size() > numScoresToKeep)
  result.resize(numScoresToKeep);
return result;

编写时,对分数进行排序,去掉前十名以外的所有分数,并覆盖现有文件。你可以用

std::fstream file;
file.open(filename, std::ios::out);
std::sort(scores.begin(), scores.end(), isScoreGreater);
if(scores.size() > numScoresToKeep)
  scores.resize(numScoresToKeep);
for(size_t i = 0; i < scores.size(); ++i)
  file << scores[i] << "n";

这一切都假设您有一个名为Score的类、针对它定义的输入/输出流函数和一个isScoreGreater函数。当我写这篇文章时,我使用了typedef,并自己定义了其他三个函数:

typedef std::pair<std::string, unsigned int> Score;
std::istream& operator>>(std::istream& inputStream, Score& score)
{
  inputStream >> score.first;
  inputStream >> score.second;
  return inputStream;
}
std::ostream& operator<<(std::ostream& outputStream, const Score& pair)
{
  outputStream << pair.first;
  outputStream << " ";
  outputStream << pair.second;
  return outputStream;
}
bool isScoreGreater(const Score& lhs, const Score& rhs)
{
  return lhs.second > rhs.second;
}

但没有什么能阻止你把它变成一个完整的课程(如果你喜欢的话)。