0

I've seen this question asked before but I can't find an answer that helps me solve my problem. There's a few things happening here. This is displaying a menu that will allow the user to:

  1. View expenses,
  2. Update expenses, or
  3. Quit to return to a previous menu.

This information is saved to a data file that should be input and output to. I have a problem with the first menu option when trying to view the data in the file. Assume there is already a data file C:\danceexpenses.txt containing this information:

DJ
100
Site
100
Food
100
Favors
100
Security
100
Ticket printing
100
Etc.
100
etc.
100

The program will not display the information. It only gives a blank line for each. Is there something I need to add to configure the output?

void charges()
{
    //Structures to hold data
    struct Expenses
    {
        string name; 
        double cost;
    };

    int chargesChoice;
    const int CHARGES_MENU_VIEW = 1, CHARGES_MENU_UPDATE = 2, CHARGES_MENU_QUIT = 3;
    const int NUM_EXPENSES = 8; //number of expenses
    Expenses danceExpenses[NUM_EXPENSES]; //array of structures
    int index; //loop counter

    cout << "\nWhat would you like to do?\n\n"
        << "1. View charges\n"
        << "2. Update charges\n"
        << "3. Return to main menu\n"
        << "Enter your choice: ";
    cin >> chargesChoice;

    while (chargesChoice < CHARGES_MENU_VIEW || chargesChoice > CHARGES_MENU_QUIT)
    {
        cout << "\nPlease enter a valid menu choice: ";
        cin >> chargesChoice;       
    }

    switch (chargesChoice)
    {
        case CHARGES_MENU_VIEW: //Display the expenses data
            myFile.open("c:\\danceexpenses.txt", ios::in); //open file
            if (!myFile)
            {
                cout << "Error opening file. Program aborting.\n";
                return;
            }
            char output[100];
            cout << "\nHere are the expected expenses for the dance:\n";
            for (index = 0; index < NUM_EXPENSES; index++)
                cout << danceExpenses[index].name << endl << endl;
            myFile.close(); //close file
            break;
        case CHARGES_MENU_UPDATE:
            //get expense data
            myFile.open("c:\\danceexpenses.txt", ios::out); //open file
            if (!myFile)
            {
                cout << "Error opening file. Program aborting.\n";
                return;
            }
            for (index = 0; index < NUM_EXPENSES; index++)
            {
                cout << "Enter the name of the expense: ";
                cin.ignore();
                getline(cin, danceExpenses[index].name);
                cout << "Enter the expected cost for this expense: ";
                cin >> danceExpenses[index].cost;
            }

            //Write data to file
            for (index = 0; index < NUM_EXPENSES; index++)
            {
                myFile << danceExpenses[index].name << endl;
                myFile << danceExpenses[index].cost << endl;
            }
            myFile.close(); //close file
            break;
        case CHARGES_MENU_QUIT:
            showMenu();
            break;
    }
    charges();
}
2
  • 1
    Your code seems to have unbounded tail recursion, which is not going to lead to happiness in the long run. Commented Apr 20, 2013 at 19:13
  • 1
    Hm I don't see any read access to the file. Or do a missing something? Commented Apr 20, 2013 at 19:25

1 Answer 1

1

If your first action is to enter 1, the code should enter:

    case CHARGES_MENU_VIEW: //Display the expenses data
        myFile.open("c:\\danceexpenses.txt", ios::in); //open file
        if (!myFile)
        {
            cout << "Error opening file. Program aborting.\n";
            return;
        }
        char output[100];
        cout << "\nHere are the expected expenses for the dance:\n";
        for (index = 0; index < NUM_EXPENSES; index++)
            cout << danceExpenses[index].name << endl << endl;
        myFile.close(); //close file
        break;

This opens the dance expenses file, but doesn't read from it. It then iterates through a list of expenses that have not been initialized, and closes the input file. There's also an unused variable output.

You need to read the data into memory before printing it out.

int num = 0;
while (myFile >> danceexpenses[num].name >> danceexpenses[num].cost)
    num++;

for (index = 0; index < num; index++)
    cout << danceExpenses[index].name << endl << endl;
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.