面向菜单的C ++程序很难实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向菜单的C ++程序很难实现相关的知识,希望对你有一定的参考价值。
我在尝试使用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 << "
";
for (int i=0; i< count; i++)
{
cout << movieTitle[i] << endl;
}
cout << "
";
}
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,即用户按下返回。因此,在userInput变量中查找整数,并将其传递给switch语句
int nr = atoi(userInput.c_str())
switch(nr){
case 1:
case 2: etc ...
另一答案
在你的代码中,不清楚为什么它直接转到案例'3'。它应该先等待用户输入。看起来像缓冲区中已有的东西。只需在'3'中放入一个cout
语句:并检查它打印的内容。如果可能的话,在那里放置断点并在调试模式下运行应用程序并检查值。希望这会帮助你。
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:
//...
}
您不必担心缓冲区中的字符。如果未读取整数,则流将失败。
以上是关于面向菜单的C ++程序很难实现的主要内容,如果未能解决你的问题,请参考以下文章
如何用 Sublime Text 实现C/C++代码的编译运行