提问者:小点点

在菜单功能中调用并显示文本文件


我对C++还是个新手,我的任务相当艰巨。 我必须创建一个菜单(我在这个菜单中挣扎得相当厉害),不仅如此,我还应该读取并显示一个文本文件。 到目前为止,我使用的唯一方法只显示文本文件的第一行。 你能帮帮我吗? 提前谢谢你。

break函数,当添加到第一种情况时,也使循环成为一堵无限的文本墙! 我不知道该怎么办。

    // Assignment 1.cpp : Tally Ho Generator

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int runMenu;

int main()
{
    int menuInput;
    bool menu = true;
    ifstream inFile;
    string ABOUT;

    // Menu Interface
    cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
    cout << "   The Tally Ho Probability Generator (MCD4720_Assignment 1)\n";
    cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
    cout << " [1] End Testing the Program\n";
    cout << " [2] Display About Information\n";
    cout << " [3] Read and store data from files\n";
    cout << " [4] Generate a Dice Tally Table\n";
    cout << " [5] Save Tally Statistics to a file\n";
    cout << " [6] Load Tally Statistics from a file\n";
    cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
    cout << "Which Option would you like (1-6)\n";
    cin >> runMenu;


    // Menu Input Function
    while (menu != false) {
        switch (runMenu)
        {
        case 1:
        {

            inFile.open("C:\\Users\\William\\Documents\\MCD Assignment 4720 1\\TallyAbout.txt");
            while (getline(inFile, ABOUT)) {
                cout << ABOUT << endl;
                inFile.close();

            }
            break;
        }
        

        case 2:
        {}
        case 3:
        {}
        case 4:
        {}
        case 5:
        {}
        case 6:
        {}

        default: {
            cout << " Input unrecognized, please choose again \n";
            cin >> runMenu;
            break;
        }
        }
        }


        cin.ignore();
        cin.get();

        return 1;
    }


共2个答案

匿名用户

到目前为止,我使用的唯一方法只显示文本文件的第一行

这是因为您在读取第一行后关闭了文件:

        while (getline(inFile, ABOUT)) {
            cout << ABOUT << endl;
            inFile.close();                // <------ here !!

        }

您不需要显式关闭文件。 该文件在infile的析构函数中关闭。

break函数,当添加到第一种情况时,也使循环成为一堵无限的文本墙! 我不知道该怎么办。

这是因为break从交换机中中断。 其他案件不予处理。 特别是,您要求用户输入的default情况将不会执行。 实际上,您从不修改menu的值,而(menu!=false)是一个无限循环。 将任何情况下必须执行的部件移出交换机:

while (menu != false) {
    switch (runMenu)
    {
        case 1:
        {

            inFile.open("C:\\Users\\William\\Documents\\MCD Assignment 4720 1\\TallyAbout.txt");
            while (getline(inFile, ABOUT)) {
                cout << ABOUT << endl;
                inFile.close();

            }
            break;
        }
        
        //...
        default: {
            cout << " Input unrecognized, please choose again \n";      
            break;
        }
    }
  
    cin >> runMenu;
    // put logic here, for example:
    menu = (runMenu == 1);
}

您应该相应地修改输出。 目前它说“输入无法识别,请再次选择”,但如果我理解正确,用户必须选择继续或不在每次迭代。 另外,对menurunmenu使用一个而不是两个变量将更不容易出错。

匿名用户

请尝试以下操作:

case 1:
{
    inFile.open("C:\\Users\\William\\Documents\\MCD Assignment 4720 1\\TallyAbout.txt");
    while (getline(inFile, ABOUT)) {
        cout << ABOUT << endl;
    }

    inFile.close();
    break;
}

在读取第一行后关闭文件,现在的区别是在读取所有行后关闭文件