0

几个星期以来,我一直在为 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 
4

4 回答 4

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并在字符串中找到了武器。

于 2013-04-10T17:20:46.037 回答
0

您是否尝试过使用指针在文件中搜索要替换的特定字符串?我还没有编写一个自己使用它的程序,但我知道它很常见。否则你只会覆盖整个文件。

请注意,我不完全确定您是否为此目的在代码中使用了指针,因为如上所述,我自己还没有使用它。但是,据我所见,我认为您没有这样做。如果我错了,请纠正我。

于 2013-04-08T13:37:01.143 回答
0

你的代码有很多问题。您正在打开一个文件两次。您在读取 ​​ifstream 时正在循环关闭它们(?)。...

然而,算法明智的你可以打开文件进行读取,将整个内容读取为字符串,关闭文件,修改字符串,打开文件进行写入,写入字符串,关闭文件。

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();
}
于 2013-04-08T13:48:57.460 回答
-1

代替

 ifstream infile("weaponlevels.txt");

采用

 ifstream infile("weaponlevels.txt", ifstream::in)
于 2013-04-08T13:21:43.990 回答