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

また、たとえば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呼び出しのエラー チェックを追加することもできます。

于 2013-11-01T07:50:36.670 に答える