面向菜单的C ++程序很难实现

问题描述 投票:-1回答:3

我在尝试使用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;
    }
c++ count int
3个回答
0
投票

我相信cin读取直到找到eol,即用户按下返回。因此,在userInput变量中查找整数,并将其传递给switch语句

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

0
投票

在你的代码中,不清楚为什么它直接转到案例'3'。它应该先等待用户输入。看起来像缓冲区中已有的东西。只需在'3'中放入一个cout语句:并检查它打印的内容。如果可能的话,在那里放置断点并在调试模式下运行应用程序并检查值。希望这会帮助你。

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

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

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

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.