如何用c++中的控制台替换txt文件中的一行
How do I replace a line in a txt file with console in c++?
我想为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;
}
但没有什么能阻止你把它变成一个完整的课程(如果你喜欢的话)。
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何使代码打印文本文件中的第一行?
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 将字符串存储到文件下一行的变量中
- 为什么这个.c文件只有一行"../xx/xx.c"?
- 比较两个没有一行共同点的大文件
- 如何在c ++中以一行(水平)打印两个文件的数据?如给定的.这两种形式来自两个不同的文本文件
- 到达分隔符时跳到文本文件的下一行
- 从文本文件中读取一行并将其存储在 C++ 中的 2D 矢量中
- 从文本文件中随机选取一行
- 在获取从文件到矢量的每一行之后,数字将被更改或销毁
- 从文件中的一行读取特定数据-C++
- 从文本文件中的每一行读取数字,并计算数字重复的次数
- 为什么这一行不输出我的文本文件?
- 从文件读取并在一行中写入 cout
- 如何有效地读取C 中的最后一行文件
- 将一行文件读入对象中的两个变量