[英]How does cin work?
我运行了这段代码
char c;
cin >> c;
cout << c;
cin >> c;
cout << c;
并写入控制台ab
,按下输入。 所以我在下一行得到了ab
。 但我无法理解它是如何运作的。 在按下之前,程序没有读取任何内容,对吧? 按下后,它会读取a
,将其保存到char c
,然后读取char c
,将a
写入控制台。 没关系。 但它怎么能读到b
在第二行呢? 它不是第二行的b
cin
是标准输入流 。 流媒体性质对于理解C ++ I / O至关重要。
默认情况下,执行cin >> x
意味着:
从当前流中的点开始,跳过可能存在的任何空格,然后尽可能长时间地阅读以获得
x
的有效表示。
让我们暂时忽略输入来自键盘的事实。 开始时流的内容是ab LINEFEED
。 执行cin >> c
,它将从输入中读取第一个字符a
。 这足以填写c
,所以阅读停止。 cin
流现在包含b LINEFEED
。 然后将变量c
写入标准输出。
接下来是另一个cin >> c
,所以再读一个字符(这次是b
)。 同样,一个字符就足够了,所以阅读结束,流内容只是LINEFEED
。 然后将b
发送到标准输出流。
标准输入和标准输出流通常与控制台绑定的事实不会以任何方式影响其内部工作。 cin
并没有“忘记”其中的内容只是因为在此期间屏幕上出现了一些输出。 特别是, cin
读取键盘,而不是“控制台上的字符”。 碰巧按下按键会在控制台上回显并将它们送到cin
。
因此,您的程序在此期间输出字符a
的事实对cin
流的内容没有影响。
cin是一个被阻止的输入。 来自键盘的任何内容都存储在缓冲区中。 当您按Enter键时,系统将缓冲区传递给应用程序代码(std :: cin代码)。 运算符>>将决定从该缓冲区读取多少 - 一个char,string,int,float等取决于操作数的类型。
cin和cout是缓冲流。 按Enter键时,'a'和'b'都会进入输入缓冲区。 '>>'运算符从该缓冲区读取(在您的情况下一次一个char)。 '<<'写入输出缓冲区。 唯一令你惊讶的是你在输出上看到“ab”而不打印“\\ n”(后一个符号应该将输出缓冲区的内容刷新到终端)。
简而言之,cin和cout都是缓冲区。 输入和输出运算符使用这些缓冲区。 换行符号启动从实际输入到输入缓冲区以及从输出缓冲区到实际输出的数据传输。
您可以学习更多关于I / O的事情。
基本上, cin
有一个数据类型char
的重载只能从输入流中获取1个字符,所以你的程序基本上是这样的:
char c;
cin >> c; // reads 'a' from the input stream (input stream contains 'ab\n')
cout << c; // prints 'a'
cin >> c; // changes c to 'b' (reads 'b')
cout << c; // prints 'b'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.