getline如何与cin一起工作?
我觉得有很多类似的问题,所以如果这是重复的,我真的很抱歉。 不过,我找不到这个具体问题的答案。
我很困惑cin传递给它时getline是如何工作的,因为我的理解是每次调用cin都应该调用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,',');
并且输入缓冲区为空,假设用户输入:
Benjamin,Lindley,Software DeveloperEnter
首先,以下字符串存储在输入缓冲区中:
"Benjamin, Lindley, Software Developern"
然后, getline
导致"Benjamin,"
从输入缓冲区读取(但会丢弃逗号)。
" Lindley, Software Developern"
对于任何未来的cin
操作,它都将保留在缓冲区中。
getline
根本不“叫” cin
。 cin
是一个对象。 对象包含数据。 cin
的数据是输入函数读取标准输入流所需的信息。 例如,如果您想从文件中读取数据,则可以打开文件并将文件对象传递给getline
。
当调用getline
,程序读取输入缓冲区中的任何内容。 如果输入缓冲区已经包含分隔符,则getline
将立即返回。 否则,它会等待。