getline如何与cin一起使用?

J S*_*J S 0 c++ input stream

我觉得有很多类似的问题,所以如果这是重复的话,我真的很抱歉.但是,我无法找到这个具体问题的答案.

当cin被传递给它时,我很困惑getline是如何工作的,因为我的理解是它应该在每次调用时调用cin.使用我正在阅读的书中的代码时,getline被调用几次,但只发送一个输入.除了在这些getline调用中之外,不会从任何地方调用cin对象.

这里发生了什么?当达到getline时,程序是否只是停在其轨道上并等待输入流传递包含所需分隔符的值?如果是这种情况,那么后续的getline调用是否必须等待,因为输入流已经有包含各自分隔符的数据?我跑了几个测试表明可能就是这种情况.

这是代码:

    string firstName;
    getline(cin,firstName,',');

    string lastName;
    getline(cin,lastName,',');

    string job;
    getline(cin,job,'\n');

    cout<<firstName<<" "<<lastName<<" is a "<<job<<endl;;
Run Code Online (Sandbox Code Playgroud)

如果这是一个愚蠢的问题再次抱歉,但我环顾四周,真的找不到答案.提前感谢您提供的任何帮助!

澄清:

此代码为控制台输入"First,Last,Job \n"输出"First Last is a Job"

Ben*_*ley 7

对函数的调用cin实际上不是对用户输入的请求(至少不是直接).它是对标准输入字符的请求.在正常的程序操作中(标准输入不是从文件或其他源引导的),标准输入存储在缓冲区中.如果标准输入缓冲区为空,并且cin正在请求更多字符,则系统将通过终端请求用户输入.(即键盘).终端请求的这个输入通常是面向行的.也就是说,它等待您按下Enter键,然后发送所有数据以存储在标准输入缓冲区中.如果cin在输入缓冲区为空之前获取所需的所有字符,那么这些字符将一直保留到下一个请求.

因此,例如,当您拨打此电话时:

getline(cin,firstName,',');
Run Code Online (Sandbox Code Playgroud)

并且输入缓冲区为空,假设用户输入:

Benjamin,Lindley,软件开发人员Enter

首先,以下字符串存储在输入缓冲区中:

"Benjamin, Lindley, Software Developer\n"
Run Code Online (Sandbox Code Playgroud)

然后getline导致"Benjamin,"从输入缓冲区读取(但丢弃逗号).

" Lindley, Software Developer\n"
Run Code Online (Sandbox Code Playgroud)

保留在缓冲区中以便将来进行任何操作cin.

  • @ooga:`<kbd>输入</ kbd>` (3认同)