我在尝试使用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;
}
答案 0 :(得分:0)
我相信cin读取直到找到eol,即用户按下返回。 因此,在userInput变量中查找整数,并将其传递给switch语句
int nr = atoi(userInput.c_str())
switch(nr){
case 1:
case 2: etc ...
答案 1 :(得分:0)
在您的代码中,不清楚为何直接进入案例&#39; 3&#39;。它应该先等待用户输入。看起来像缓冲区中已有的东西。只需输入一个cout
语句以及&#39; 3&#39;:然后检查它打印的内容。如果可能的话,在那里放置断点并在调试模式下运行应用程序并检查值。希望这会对你有所帮助。
case('3'):
{
cout<<"Value of userInput is: "<<userInput<<endl;
cout << getTitle(movieTitle);
break;
}
或者,您可以在cin
之前添加以下代码行,如下所示
std::cin.clear();
cin >> userInput;
答案 2 :(得分:0)
我建议输入一个整数而不是输入字符。
您还需要更改case
值:
int selection = 0;
//...
cin >> selection;
switch (selection)
{
case 1:
//...
}
您不必担心缓冲区中的字符。如果未读取整数,则流将失败。