0

这是我的代码:

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 时它会跳过“输入您的项目名称:”并且对于“输入您的项目描述”是正确的。为什么这样做?在所有后续循环中,它都能正常工作,首先询问项目名称并等待输入。

4

1 回答 1

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...

此外,您不应该这样做 eg while (cin) ...,因为在输入操作失败之前不会设置 eof 和错误标志。这意味着如果您在第一次输入提示时按下 EOF 键(CTRL-ZCTRL-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调用添加额外的错误检查。

于 2013-11-01T07:50:36.670 回答