使用cin时字符串变量没有被覆盖

问题描述:

enum state{ 
    state_Mmenu,   // State 0 
    state_settingmenu,  // State 1 
    state_gamemenu,   // State 2 
    state_savegamemenu,  // State 3 
    state_loadgamemenu,  // State 4; 
    state_Exit,    // State 5; 
    state_other 
}; 

state stateMmenu(); 
state statesettingmenu(string, string); 
state stategamemenu(); 
state statesavegamemenu(string, string, string, ofstream&); 
state stateloadgamemenu(string, string, string, ifstream&); 
state stateExit(); 



int main() 
{ 
    state curr=state_other; 

    string filename= "PlayerOne.jak"; 
    string fname="Player"; 
    string lname="One"; 
    ifstream inFS; 
    ofstream outFS; 

    while(curr != state_Exit) 
    { 
     switch(curr) 
     { 
      case state_Mmenu: 
       curr = stateMmenu(); 
       break; 

      case state_settingmenu: 
       curr = statesettingmenu(fname, lname); 
       break; 

      case state_gamemenu: 
       curr = stategamemenu(); 
       break; 

      case state_savegamemenu: 
       curr = statesavegamemenu(fname, lname, filename, outFS); 
       break; 

      case state_loadgamemenu: 
       curr = stateloadgamemenu(fname, lname, filename, inFS); 
       break; 

      default: 
       cout << "Don't Tip the Vending Machine"<<endl; 
       curr = state_Mmenu; 
       break; 
     } 
    } 

    return 0; 
} 


state statesavegamemenu(string fname, string lname, string filename, 
         ofstream outFS) 
{ 
    state next=state_savegamemenu; 
    int choice4=0; 
    cout<<" -Save Game Menu-----------------"<<endl; 
    cout<<"1. File Name - "<<filename<<endl; 
    cout<<"2. Save" <<endl; 
    cout<<"3. Game Menu" <<endl; 
    cout<<"----------------------------"<<endl; 
    do 
    { 
     cout << "Choice? "<< endl; 
     cin >> choice4; 
     cin.clear(); 
     cin.ignore(10000,'\n'); 

    } while(!cin.good()); 

    switch(choice4) 
    { 
     case 1: 
     { 
      cout<<"What would you like to save this file as? "; 
      cin>>filename; 
      cout<<endl; 
      next = state_savegamemenu; 
     } 
      break; 
     case 2: 
     { 
      outFS.open(filename.c_str()); 
      if(!outFS.is_open()) 
      { 
       next = state_savegamemenu; 
       break; 
      } 
      else 
      { 
       outFS<<fname<<endl; 
       outFS<<lname<<endl; 
      } 
      outFS.close(); 
      next = state_savegamemenu; 
     } 

      break; 
     case 3: 
      next = state_gamemenu; 
      break; 
     default: 
      cout << "Bad Input!"<<endl; 
      next = state_savegamemenu; 
      break; 
    } 
    cout <<endl; 
    return next; 
} 

state stateloadgamemenu(string fname, string lname, string filename, 
         ifstream inFS) 
{ 
    state next=state_loadgamemenu; 
    int choice5=0; 
    cout<<" -Save Game Menu-----------------"<<endl; 
    cout<<"1. File Name - "<<filename<<endl; 
    cout<<"2. Load" <<endl; 
    cout<<"3. Main Menu" <<endl; 
    cout<<"----------------------------"<<endl; 
    string filecontent; 
    do 
    { 
     cout << "Choice? "<< endl; 
     cin >> choice5; 
     cin.clear(); 
     cin.ignore(10000,'\n'); 

    } while(!cin.good()); 

    switch(choice5) 
    { 
     case 1: 
     { 
      cout<<"What file would you like to load? "; 
      cin>>filename; 
      cout<<endl; 
      next = state_loadgamemenu; 
     } 
      break; 
     case 2: 
     { 
      inFS.open(filename.c_str()); 
      if(!inFS.is_open()) 
      { 
       next = state_savegamemenu; 
       break; 
      } 
      else 
      { 
       while(!inFS.eof()) 
       { 
        inFS >> filecontent; 
        if(inFS.good()) 
        { 
         cout << filecontent << endl; 
        } 
       } 
      } 
      inFS.close(); 
      next = state_loadgamemenu; 
     } 

      break; 
     case 3: 
      next = state_Mmenu; 
      break; 
     default: 
      cout << "Bad Input!"<<endl; 
      next = state_loadgamemenu; 
      break; 
    } 
    cout <<endl; 
    return next; 
} 

所以我的问题是,在代码中,我试图覆盖用户的cin的文件名。问题是当我刷新状态机时,文件名不会被覆盖,它仍然是我在int main()中命名的“playerone.jak”。如果有人知道这是为什么,将不胜感激。使用cin时字符串变量没有被覆盖

+1

请张贴相关的代码,而不是一切... – mutex36

+0

按引用传递你的'filename'参数。这里是一个副本。 –

+0

那么你的意思是使用一个字符串指针? – flameboy7365

此功能

state stateloadgamemenu(string fname, string lname, string filename, 
         ifstream inFS) 

应该是

state stateloadgamemenu(string fname, string lname, string & filename, 
         ifstream inFS) 

的原因是,当你传递一个字符串或C++它是按值传递的任何对象,这意味着所调用的函数内的任何更改将不保存到原始变量。

通过引用传递它意味着相同的对象将从被调用函数返回给调用者。

您可以主裁对这个问题的详细信息, Pass by Reference/Value in C++

+0

非常感谢,这是问题所在! – flameboy7365