2 qq 32194415 qq_32194415 于 2016.03.27 09:35 提问

C++中的cout的缓存区清空问题

很多地方都看到这样一个描述“cout有一个缓存区,当用cout向输出流中插入待输出内容时,这些待输出内容并不是立即就被送到输出设备了,而是先存入到这个缓存区中,当cout遇到endl或者缓存区满的时候才会向屏幕输出”请问这句话是对的吗?我怎么总感觉不对劲啊,感觉有矛盾啊,如果这个说法是正确的,那么是不是说当执行输出语句cout<<a时如果缓存区没有满或者没有遇到endl的时候就不能进行输出了吗?是这样理解吗?求解啊!!!

2个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.27 21:04
已采纳

在Unix下的C语言用select函数就可以判断有无数据。
Windows下网络也可用select,键盘输入则用_kbhit函数。
MSDN里的例子:
#include
#include

int main( void )
{
/* Display message until key is pressed. */
while( !_kbhit() )
_cputs( "Hit me!! " );

/* Use _getch to throw key away. */
printf( "\nKey struck was '%c'\n", _getch() );
}
也可以参考http://bbs.csdn.net/topics/390497761

qq423399099
qq423399099 回复qq_32194415: 这个说来话长了,楼主参考下http://www.cnblogs.com/charm/archive/2010/08/17/1801419.html
2 年多之前 回复
qq_32194415
qq_32194415 没有懂啊 大神 我是初学者 能具体解释一下这个cout的缓存区方面的内容吗?
2 年多之前 回复
qq423399099
qq423399099   Ds   Rxr 2016.03.27 09:58

因为cout是行缓冲的,只有在以下情况下,cout才会立即输出:
(1)缓冲区满
(2)用户手动刷新,显式地清空缓冲
(3)程序结束
(4)从标准输入流中读数据
与cout不同,printf是无缓存的,立即输出。你可以把cout换成printf,就能看出区别了。

qq_32194415
qq_32194415 回复qq_32194415: 这段代码的六七行都可以输出a的值吗?
2 年多之前 回复
qq_32194415
qq_32194415 #include<iostream> using namespace std; int main() { int a=1; cout<<a; cout<<a<<endl; return 0; }
2 年多之前 回复
qq_32194415
qq_32194415 回复小灸舞: #include<iostream>
2 年多之前 回复
qq423399099
qq423399099 回复qq_32194415: 最好贴一下代码
2 年多之前 回复
qq_32194415
qq_32194415 回复小灸舞: 但是我用vs2015写出来的输出程序这一句是可以运行的啊 那这是为什么呢?
2 年多之前 回复
qq423399099
qq423399099 回复qq_32194415: 是啊
2 年多之前 回复
qq_32194415
qq_32194415 回复小灸舞: 什么意思啊???
2 年多之前 回复
qq423399099
qq423399099 回复qq_32194415: yep
2 年多之前 回复
qq_32194415
qq_32194415 那是不是说cout<<a;这一句在缓存区没有满或者没有遇到endl的时候就不能进行输出了???
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C++流操作 清理缓冲区
#include using namespace std; int main() { cout cout return 0; } 遇到endl才刷新缓冲区,endl在执行换行时还调用了cout的成员函数flush(),该方法会输出缓冲区中的所有数据并且刷新缓冲区。 有关输出的相关函数 osstream类除了提供各种类型operator put()和write
C语言之清空缓存区
在C语言中,我们常常需要去清空缓存区,对于缓存区清空的重要性,接下来我们进行具体的说明。 首先我们先解释一下缓存区。1.缓存区C语言中的缓冲区又称为缓存,它是内存空间的一部分。   也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。     C语缓冲区分为三种类型:1、全缓冲 2、行缓冲 3、不带缓冲。   缓冲区根据其对应的是输
C语言清空输入缓冲区
先来看一段代码: #include int main() { int num; char ch ; scanf("%d", &num); scanf("%c", &ch); printf("hello world\n"); system("pause"); return 0; } 设想输入一个数字和一个字母,应该出现如下情况 1 a hello
scanf()中清除输入缓冲区的几种方法归纳
又重新过一遍C语言,感觉每次重学C语言都有不同的感受,遇到了一个问题,就是scanf()这个问题,其实细究起来,也有很多可以值得深挖的,实际上每次细细的挖掘的话,都是对C语言的更透彻的认识. 那么下面我就对scanf()中清除输入缓冲区的几种方法归纳: 应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出
在C / C ++中清除输入缓冲区
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。CSDN视频网址:http://edu.csdn.net/lecturer/144      什么是缓冲区? 临时存储区称为缓冲区,所有标准输入和输出设备都包含输入和输出缓冲器。在标准C / C +
\n 刷新缓冲区问题
\n 刷新缓冲区  相关代码+理论
C语言清空缓冲区
看下面一个例子: [cpp] view plain copy   #include    int main()   {       int num;       char ch ;       scanf("%d", &num);       scanf("%c", &ch);       printf("hello world\n"
零基础学C语言 笔记四 Scanf函数清除缓冲区
Scanf函数清除缓冲区 之前涉及到scanf会先到缓冲区看看是否存在数据,若存在数据,就直接拿缓冲区的数据过来使用,这就涉及到了一个问题,那如果缓冲区的数据不是我想要的呢?               方法一:我们用scanf吸收掉               我们的代码这样写:                             int main(int argc, const
C/C++ 输入输出缓冲区在Windows和Linux下对比
c++中cin、cout,cerr和c的stdin、stdout、stderr都是同步的,即iostream 对象和 and cstdio流是同步的,同步关系如下:同步即表明我们可以在程序中混合用cout和printf或其他对应的流对。可以用std::ios_base::sync_with_stdio(false)来取消这种同步,取消后,如下程序中cout和printf就不是按照预期的顺序输出std
如何正确清空cin缓存
关于cin缓存的清空,网上有各种说法。最多的是使用 cin.sync(); 但是,关于这个sync方法在不同的编译器中有不同的实现。VC中确实可以清空cin的缓存,但是在GNU中,不行。因此使用sync方法是没有通用性的。又有说法是使用 cin.seekg(0, ios_base::end); 但是依旧无法正常工作。以下是一个测试代码