getline如何与cin一起使用?

时间:2014-02-09 02:22:26

标签: 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;;

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

澄清:

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

2 个答案:

答案 0 :(得分:7)

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

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

getline(cin,firstName,',');

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

  
    

Benjamin,Lindley,软件开发人员输入

  

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

"Benjamin, Lindley, Software Developer\n"

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

" Lindley, Software Developer\n"
对于cin以后的任何操作,

仍保留在缓冲区中。

答案 1 :(得分:3)

getline根本没有“呼叫”cincin是一个对象。对象包含数据。 cin中的数据是输入函数读取标准输入流所需的信息。例如,如果您想从文件中读取,则打开文件并将文件对象传递给getline

当调用getline时,程序会读取输入缓冲区中的任何内容。如果输入缓冲区已包含分隔符,则getline将立即返回。否则它会等待。