在C ++中编辑文件时的奇怪结果

时间:2013-04-08 13:13:45

标签: c++ fstream

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

4 个答案:

答案 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)