2013-04-08 1 views
0

2 주 동안 Xbox 게임 Call of Duty : Modern Warfare 3의 무작위 클래스 생성기를 개발했습니다.이 게임에서 다른 무기의 레벨은 당신은 무기를 더 사용합니다. 합니다 (C++에서 파일을 편집 할 때 이상한 결과가 발생했습니다.

m4a1-8 

: 나는 같을 것이다 무기 및 형식 무기 레벨 8 그래서

weapon-weapon_level 

M4A1와 함께 별도의 줄에 데이터를 저장하는 텍스트 파일에서 자신의 수준을 저장하고 무기는 모두 구두점이나 공백없이 소문자로 표시됩니다.)

나는 이미 파일을 만들고 파일을 읽는 방법을 작성했지만 파일을 편집하는 방법을 원한다. 그래서 사용자는 레벨을 변경하려는 무기와 새 레벨을 입력한다. 여기에 내가 지금까지 가지고있는 것이있다 : (파일은 "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되기에, 무기 레벨과 무기 및 7m4a1를 입력하면이된다 :

7 
a1-3 
+1

ofstream에 다른 파일을 사용하십시오.당신은 같은 파일을 읽고 쓰고 있습니다. 또한 파일을 사용하기 전에 파일이 성공적으로 열렸는지 확인하십시오. 'ofstream outfile ("weaponlevels.txt"); ' –

+0

@stardust_ 동일한 파일을 읽고 쓰고 싶습니다. 내 질문에 그것은 ** 편집 ** 그것을 말하고있다 – imulsion

+0

'ofstream'으로 파일을 열면 기본 모드는 파일을 지우는'ios_base :: out'이며, 추가하려면'ios_base :: app'. 파일의 중간에 어떤 데이터를 변경하고 다른 크기를 원하면 교체 할 부분을 메모리에서 다시 빌드하고'ostream'을 사용하여 파일을 다시 작성해야합니다. 이전 파일을 삭제 한 후 나중에 이름을 변경하는 새 파일. –

답변

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

대신

ifstream infile("weaponlevels.txt"); 

사용

ifstream infile("weaponlevels.txt", ifstream::in) 
+2

ifstream :: in은 ifstream의 기본 모드입니다 –

+0

nope, didn ' 일하지 마라. 정확히 같은 일이 일어났습니다. – imulsion

0

는 포인터를 사용하여 시도 되세요 특정 문자열을 대체 할 파일을 검색하려면? 나는 이것을 사용하는 프로그램을 아직 작성하지 않았지만 꽤 일반적이라는 것을 알고있다. 그렇지 않으면 전체 파일을 덮어 쓰게됩니다.

위에서 언급했듯이이 목적을 위해 코드에서 포인터를 사용했는지 여부는 아직 확실하지 않습니다. 그러나, 내가 본 것에서 나는 당신이 그렇게 생각하지 않습니다. 내가 틀렸다면 나를 바로 잡아라.

+0

아니요, 이전에는 포인터를 사용하지 않았습니다. 그들이하는 일이나 그들이 필요한 이유조차 모르겠다. – imulsion

+0

나는 포인터에 대한 문서로 안내 하겠지만, 너무 명백 할 수도있다. – 4rkain3

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(); 
} 
+0

'std ::'를 없애기 위해 #include해야 할 것은 무엇입니까? 이미 포함 된 문자열 – imulsion

+0

@imulsion을 포함하고 있습니다. 포함 후에는'using namespace std;'또는 선호하는'std :: string;'을 사용합니다. –

+0

이제 텍스트 파일에서'm4a1-3'이'16', 개행,'1-3'으로 변경됩니다. – imulsion