几个星期以来,我一直在为 Xbox 游戏使命召唤:现代战争 3 开发一个随机类生成器。在这个游戏中,不同的武器有不同的等级,随着你使用武器的次数增加,等级会增加。我将武器及其级别存储在一个文本文件中,该文件将数据存储在不同的行中,格式为
weapon-weapon_level
所以武器等级为 8 的 M4A1 看起来像:
m4a1-8
(武器都是小写的,没有标点和空格)。
我已经编写了创建文件和读取文件的方法,但是我想要一个编辑文件的方法,所以用户输入他们想要更改其级别的武器,然后输入新级别。这是我到目前为止所拥有的:(该文件名为“weaponlevels.txt”)
void WeaponLevelFile::editFile()
{
string line;
string weapon;
string weaponent;
string weaponlevel;
string temp;
cout<<"Please enter the weapon whose level you wish to change. Enter the name in lowercase, with "<<endl;
cout<<"no spaces or punctuation except full stops. E.g. SCAR-L becomes scarl and Barrett .50cal "<<endl;
cout<<"becomes barrett.50cal."<<endl;
cin>>weaponent;
cout<<"Please enter the new weapon level."<<endl;
cin>>temp;
ifstream infile("weaponlevels.txt");
ofstream outfile("weaponlevels.txt");
while (getline(infile, line))
{
istringstream ss(line);
getline(ss,weapon,'-');
if (weapon == weaponent)
{
ss>>weaponlevel;
weaponlevel=temp;
outfile<<weaponlevel<<endl;
infile.close();
outfile.close();
}
}
}
但是这种方法不起作用;它所做的只是擦除文件(因此文件为空白)。为什么要这样做,什么是更好的方法?
编辑:@stardust_ 的回答效果最好,但仍然没有完全做到。这是代码:
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main()
{
string temp;
string line;
string weapon;
string weaponent;
string weaponlevel;
cout<<"enter weapon"<<endl;
cin>>weaponent;
cout<<"enter level"<<endl;
cin>>temp;
ifstream infile("weaponlevels.txt");
std::string in_str((std::istreambuf_iterator<char>(infile)),
std::istreambuf_iterator<char>());
infile.close();
stringstream infile_ss(in_str);
while (getline(infile_ss, line))
{
istringstream ss(line);
getline(ss,weapon,'-');
if (weapon == weaponent)
{
ss>>weaponlevel;
weaponlevel=temp;
infile_ss<<weaponlevel<<endl;
}
}
ofstream outfile("weaponlevels.txt");
outfile << infile_ss.str();
outfile.close();
}
它修改了“weaponlevels.txt”的正确部分,但并没有完全做到这一点。如果我m4a1
作为武器和7
武器级别进入,而不是成为m4a1-7
它:
7
a1-3