我觉得有很多类似的问题,所以如果这是重复的话,我真的很抱歉。但是,我无法找到这个具体问题的答案。
我很困惑,当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”
答案 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
根本没有“呼叫”cin
。 cin
是一个对象。对象包含数据。 cin
中的数据是输入函数读取标准输入流所需的信息。例如,如果您想从文件中读取,则打开文件并将文件对象传递给getline
。
当调用getline
时,程序会读取输入缓冲区中的任何内容。如果输入缓冲区已包含分隔符,则getline
将立即返回。否则它会等待。