将数据从文本文件读取到结构数组中

时间:2013-04-20 19:01:37

标签: c++ arrays file structure

我之前看过这个问题,但我找不到能帮我解决问题的答案。这里发生了一些事情。这将显示一个菜单,允许用户:

  1. 查看费用,
  2. 更新费用,或
  3. 退出以返回上一个菜单。
  4. 此信息将保存到应输入和输出的数据文件中。尝试查看文件中的数据时,我遇到第一个菜单选项的问题。假设已有一个包含此信息的数据文件C:\danceexpenses.txt

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

    程序不会显示信息。它只给每个空白行。我需要添加一些东西来配置输出吗?

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

1 个答案:

答案 0 :(得分:1)

如果您的第一个操作是输入1,则代码应输入:

    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;

这会打开舞蹈费用文件,但不会从中读取。然后,它会遍历尚未初始化的开销列表,并关闭输入文件。还有一个未使用的变量output

在打印之前,您需要将数据读入内存。

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

for (index = 0; index < num; index++)
    cout << danceExpenses[index].name << endl << endl;