1
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;
}

So my issue is that in the code I am trying to overwrite filename with a cin from the user. The problem is that when I refresh the state machine, the filename isn't overwritten and it's still the "playerone.jak" that I had it named in int main(). If anyone knows why this is that would be much appreciated.

WhozCraig
  • 65,258
  • 11
  • 75
  • 141

1 Answers1

0

This function

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

should be

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

The reason is that when you pass a string or any object in C++ it is passed by value which means any changes inside the called function will not be saved to the original variable.

Passing it by reference means same object will get the changes from the called function back to the caller.

You can referee to this question for more details Pass by Reference / Value in C++

Community
  • 1
  • 1
Mahmoud Fayez
  • 3,398
  • 2
  • 19
  • 36