面向菜单的程序C++的困难

Difficulty in a menu oriented program for C++

本文关键字:C++ 程序 菜单      更新时间:2023-10-16

我在尝试使用 getline 命令时遇到问题,用户可以在其中输入电影,然后添加到电影集合(存储在"movies.txt中(

我的代码正在编译,但它会自动从第 3 种情况开始。当我按"q"退出该案例时,它会恢复到菜单,但是当我尝试写出文件或打印集合时,没有保存任何电影标题。我应该何去何从?我觉得我正处于理解这一点的风口浪尖。

    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    const int ARRAY_SIZE = 200;
    string movieTitle [ARRAY_SIZE];
    int loadData (string pathname);
    int writeData (string pathname);
    int getTitle (string movieTitle[]);
    void showAll (int count);
    int main()
    {
        loadData("movies.txt");
        char userInput;
        string movieTitle[ARRAY_SIZE];
        int count = getTitle(movieTitle);
        bool endOfProgram = false;
        while (endOfProgram ==false)
        {
            cout << "1. Read in Collection" << endl;
            cout << "2. Print Collection" << endl;
            cout << "3. Add a Movie to the Collection" << endl;
            cout << "4. Write out Collection" << endl;
            cout << "5. Quit the Program" <<endl;
            cin >> userInput;
            switch(userInput)
            {
                case('1'): 
                {
                    loadData("movies.txt");
                    break;
                }
                case('2'):
                {
                    showAll(loadData("movies.txt"));
                    break;
                }
                case('3'):
                {
                    cout << getTitle(movieTitle);
                    break;
                }
                case('4'):
                {
                    cout <<"Write out Collection" << endl;
                    writeData("movies.txt");
                    break;
                case('5'):
                {
                    endOfProgram=true;
                    cout << "Have a nice day" <<endl;
                    break;
                }
            }
            }
        }
    }
    int loadData (string pathname)
    {
        int count = 0;
        ifstream inFile;
        inFile.open(pathname.c_str());
        if (!inFile)
            return -1;
        else
        {
            while(!inFile.eof())
            {
                getline(inFile, movieTitle[count]);
                count++;
            }
        }
        return count;
    }
    int writeData (string pathname)
    {
        ofstream outfile;
        outfile.open("movies.txt");
        if(!outfile.is_open())
        {
            cout << "Cannot open movies.txt" << endl;
            return -1;
        }
        outfile.close();
        return 0;
    }
    void showAll (int count)
    {
        cout << "n";
        for (int i=0; i< count; i++)
        {
            cout << movieTitle[i] << endl;
        }
        cout << "n";
    }
    int getTitle (string movieTitle[])
    {
        string movie;
        int count = 0;
        while(true)
        {
            cout <<"Enter Movie Titles (Type 'q' to quit)" <<endl;
            cin >> movie;
            if (movie == "q")
            {
                break;
            }
            movieTitle [count] = movie;
            count++;
        }
        return count;
    }
我相信

cin 会读取直到找到 eol,即用户按 return 键。因此,在userInput变量中查找整数,并将其传递给switch语句

int nr = atoi(userInput.c_str())
switch(nr){
    case 1:
    case 2: etc ...

在您的代码中,不清楚为什么它直接转到案例"3"。它应该首先等待用户输入。似乎缓冲区中已经有可用的东西。只需将一个cout语句放在大小写"3"中:并检查它打印的内容。如果可能,将断点放在那里,并在调试模式下运行应用程序并检查值。希望这对您有所帮助。

     case('3'):
            {
                cout<<"Value of userInput is: "<<userInput<<endl; 
                cout << getTitle(movieTitle);
                break;
            }

或者,您可以在cin之前添加以下代码行,如下所示

std::cin.clear();
cin >> userInput;

我建议输入一个整数而不是一个字符作为你的输入。您还需要更改case值:

int selection = 0;
//...
cin >> selection;
switch (selection)
{
  case 1: 
  //...
}

您不必担心缓冲区中的字符。 如果未读取整数,则流将失败。