几个星期以来,我一直在为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();
}
它修改了&#34; weaponlevels.txt&#34;的正确部分,但并没有完全做到。如果我输入m4a1
作为武器而7
作为武器等级,而不是成为m4a1-7
它将成为:
7
a1-3
答案 0 :(得分:1)
经过大量的工作,以下是有效的:
#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);
ostringstream out;
while (getline(infile_ss, line))
{
istringstream ss(line);
getline(ss,weapon,'-');
out << weapon << '-'; // Write the first part of the line.
if (weapon != weaponent)
{ // Not the correct weapon so just write the original information.
ss >> weaponlevel;
out << weaponlevel << endl;
}
else
{ // Found the desired weapon, change the level.
out << temp << endl;
}
}
我将整个字符串加载到ostringstream
并在字符串中找到了武器。
答案 1 :(得分:0)
您是否尝试过使用指针在文件中搜索要替换的特定字符串?我还没有编写一个自己使用它的程序,但我知道这很常见。否则你只会覆盖整个文件。
请注意,我并不完全确定您是否在代码中使用了指针,因为正如我上面所述,我还没有自己使用它。但是,从我看到的情况来看,我认为你没有。如果我错了,请纠正我。
答案 2 :(得分:0)
您的代码存在许多问题。您正在打开文件两次。你正在读取它们时关闭ifstreams(?)。 ...
然而算法明智的是,您可以打开文件进行读取,将整个事物读取到字符串,关闭文件,修改字符串,打开文件进行写入,写入字符串,关闭文件。
int main()
{
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();
}
答案 3 :(得分:-1)
而不是
ifstream infile("weaponlevels.txt");
使用
ifstream infile("weaponlevels.txt", ifstream::in)