简体   繁体   English

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

[英]Reading data from a text file into an array of structs

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: 假设已经有一个包含以下信息的数据文件C:\\danceexpenses.txt

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

If your first action is to enter 1, the code should enter: 如果您的第一个动作是输入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;

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 . 还有一个未使用的变量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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM