这是我的代码:
string getFileContents(istream& file_contents){
string line;
getline(file_contents, line);
return line;
}
project read_project(istream& in){
project newproject;
while(cin){
cout << "Enter your project name: ";
newproject.proname = getFileContents(cin);
cout << "Enter a description: ";
newproject.prodesc = getFileContents(cin);
cout << "How long until deadline: ";
newproject.protime = getFileContents(cin);
promap.insert(pair<string, project> ( newproject.proname , newproject));
cout << endl << "You created a new project: " << newproject.proname
<< endl << "Project description: " << newproject.prodesc ;
}
}
int main(){
string inputcmd;
while (cin){
cout << "TYPE A COMMAND" << endl;
cin >> inputcmd;
if (inputcmd == "makenew")
cout << "MAKING NEW PROJECT";
read_project(cin);
}
return 0;
我的目标是在地图中成功存储项目类型。用户首先输入'命令'“makefile”,这将调用read_project函数,该函数都以cin作为参数进行操作。问题是,当我运行代码时,它给出了奇怪的结果,就像我第一次键入makefile并跳过“输入你的项目名称:”并且正确地执行“输入你的项目描述”。为什么这样做?在所有后续循环中它正常工作,首先询问项目名称并等待输入。
答案 0 :(得分:2)
当您在main
函数中执行初始输入时,它会读取一个字符串,但会在缓冲区中租用换行符。因此,当您稍后调用std::getline
时,它会将该换行读为空行。
你可以通过这样做来克服它。
cout << "TYPE A COMMAND" << endl;
cin >> inputcmd;
// Skip to the end of the line, and remove the newline from the input buffer
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
// The rest of the code...
另外,你不应该这样做,例如while (cin) ...
,因为在输入操作失败之前不会设置eof和错误标志。这意味着如果您在第一个输入提示符处按下EOF键( CTRL-Z 或 CTRL-D (取决于系统)),您将不会注意到它您试图读取所有输入,这将失败,但您不会检查它。
相反,例如。
cout << "TYPE A COMMAND" << endl;
while (cin >> inputcmd)
{
...
cout << "TYPE A COMMAND" << endl;
}
一个简单而完整的例子,显示了我上面描述的技术:
#include <iostream>
#include <string>
void read_project()
{
std::string name, descr, deadline;
std::cout << "Project name: ";
std::getline(std::cin, name);
std::cout << "Project description: ";
std::getline(std::cin, descr);
std::cout << "Project deadline: ";
std::getline(std::cin, deadline);
std::cout << "Project entered:\n"
<< " Name : " << name << '\n'
<< " Description: " << descr << '\n'
<< " Deadline : " << deadline << '\n';
}
int main()
{
std::string cmd;
std::cout << "Enter command: ";
while (std::cin >> cmd)
{
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
if (cmd == "makenew")
read_project();
std::cout << "Enter command: ";
}
}
注意:您可能还想为std::getline
电话添加额外的错误检查。