[英]How does getline work with cin?
我觉得有很多类似的问题,所以如果这是重复的话,我真的很抱歉。 不过,我找不到这个特定问题的答案。
我对将cin传递给getline时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,Job \\ n”输出“ First Last is a Job”
使用cin
调用函数实际上并不是请求用户输入(至少不是直接输入)。 这是标准输入中的字符请求。 在正常的程序操作中(标准输入不从文件或其他来源定向),标准输入存储在缓冲区中。 如果标准输入缓冲区为空,并且cin
请求更多字符,则系统将通过终端请求用户输入。 (即键盘)。 终端要求的输入通常是面向行的。 也就是说,它等待您按下Enter键,然后发送所有要存储在标准输入缓冲区中的数据。 如果cin
在输入缓冲区为空之前获得了所需的所有字符,则这些字符将保留到下一个请求为止。
因此,例如,当您进行此调用时:
getline(cin,firstName,',');
并且输入缓冲区为空,假设用户输入以下内容:
本杰明·林德利,软件开发人员Enter
首先,以下字符串存储在输入缓冲区中:
"Benjamin, Lindley, Software Developer\n"
然后, getline
导致从输入缓冲区中读取"Benjamin,"
(但会丢弃逗号)。
" Lindley, Software Developer\n"
保留在cin
将来进行任何操作的缓冲区中。
getline
根本不“呼叫” cin
。 cin
是一个对象。 对象包含数据。 cin
的数据是输入函数读取标准输入流所需的信息。 例如,如果要读取文件,则可以打开文件,然后将文件对象传递给getline
。
调用getline
,程序将读取输入缓冲区中的内容。 如果输入缓冲区已经包含定界符,则getline
将立即返回。 否则它将等待。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.