c/c++ 输入输出缓冲区

关于缓冲区的详细介绍,请参考

C++编程对缓冲区的理解

CPP的输入输出流和缓冲区

c++输出缓冲区刷新

(1)c++中cin、cout,cerr和c的stdin、stdout、stderr都是同步的,即iostream
对象和 and cstdio流是同步的,同步关系如下:

同步即表明我们可以在程序中混合用cout和printf或其他对应的流对。可以用std::ios_base::sync_with_stdio(false)来取消这种同步,取消后,如下程序中cout和printf就不是按照预期的顺序输出

std::ios_base::sync_with_stdio(false);
    for(int i
= 0 ; i < 10; i++)
    {

        cout<<"1 ";

        printf("2 ");

    }

windows下输出是:2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1

linux下是:1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2

正是因为这种同步,所以cin、cout比scanf、printf速度要慢,如果我们在使用cin、cout输入输出前加一句std::ios_base::sync_with_stdio(false),其实速度和scanf、printf差不多。速度对比可以参考探寻C++最快的读取文件的方案

(2)以下程序

for(int i = 0 ; i < 10; i++)
    {

        cout<<"1 ";

    }
    while(1);

以上程序在windows下立即输出10个1,linux下不输出。说明windows下默认cout是无缓冲的(window可以通过cout<<stdout->bufsiz来查看缓冲区大小,windows不能这么做),linux下是有缓冲的。(cout换成printf也是一样)

(3)我们可以通过函数setbufsetvbuf
自己设置输入输出流的缓冲区,需要注意的是不管程序中申请的的缓冲区实际大小为多少,setbuf都将缓冲区设置的大小为BUFSIZ(这个宏在windows下是512,ubuntu下是1024),
setvbuf则可以设置缓冲区大小以及缓冲区的模式(行缓冲、全缓冲、无缓冲),需要注意的是这两个函数设置的是c的输入输出缓冲区,因为c++和c的缓冲区是同步的,所有该函数会对c++有影响                        
本文地址

char buf[1024];

setbuf(stdout, buf);

for(int i = 0 ; i < 10; i++)
{
cout<<"1 ";

}
while(1);

此时windows和linux下都没有输出1

(4)因为默认情况下,cin是和cout绑定的,cin 会刷新cout的缓冲区,可以用函数cin.tie(0)来解绑定。所以在上面代买的基础上,在while(1); 前面加上:int a;
cin>>a; 此时所有的1就可以输出了。

char buf[1024];

setbuf(stdout, buf);

for(int i = 0 ; i < 10; i++)
    {

      cout<<"1 ";

    }

int a; cin>>a;
while(1);

加上cin.tie(0)后,以下的代码没有输出1,因为cin已经和cout解绑定了,cin刷新不了cout的缓冲区。(可以cin.tie(&cout)来绑定,注意cout没有tie方法)

char buf[1024];

setbuf(stdout, buf);

cin.tie(0);

for(int i = 0 ; i < 10; i++)
    {

       cout<<"1 ";

    }

int a; cin>>a;
while(1);

有点奇怪的是以下代码还是会输出1,即默认缓冲区的情形下,接触绑定没有产生效果。stackoverflow是这样解释的

cin.tie(0);

for(int i = 0 ; i < 10; i++)
{
cout<<"1 ";

}

int a; cin>>a;
while(1);

【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3733243.html

c/c++ 输入输出缓冲区,布布扣,bubuko.com

时间: 2024-10-25 06:52:47

c/c++ 输入输出缓冲区的相关文章

c语言输入输出缓冲区的概念

语言输入输出缓冲区的概念 你肯定会奇怪为什么一开始先说这个,一开始不都是数据类型什么的嘛,这个写在最前面因为后面的程序即使最简单的code都会用到输入输出,输出比较简单,可以放在后面再说,但是输入就不同了,如果不先了解一下,可能会得到和你预想不同的结果哦^_^.也正是由于和一般的c语言介绍方式不同,为了看起来正规一些,我就把这章叫做chapter0了,完全可以先跳过去,直接看chapter1. 1.getchar 先引用一下前人的成果(有修改)^_^:http://blog.csdn.net/c

C/C++中关于输入输出缓冲区和流的概念理解

(本文章关于缓冲区概念的理解部分取自:http://developer.51cto.com/art/201107/277186.htm) 首先可以看下快递的寄送过程: 源地址(商家的仓库)——中转地(快递公司的仓库)——目的地(买家) 我们从淘宝商家买衣服,商家通过快递公司把商品送到我们手里的这个过程可以形象的解释下缓存区和流的这个概念. 1, 淘宝商家不会亲自把商品给买家送过来的,因为这样效率太低了,商家会通过快递公司这个中转,然后快递公司再把东西送给买家.淘宝商家就是在键盘上打字,买家就是程

C++输入输出缓冲区的刷新问题

当我们对文件流进行操作的时候,它们与一个streambuf 类型的缓存(buffer)联系在一起.这个缓存(buffer)实际是一块内存空间,作为流(stream)和物理文件的媒介.例如,对于一个输出流, 每次成员函数put  (写一个单个字符)被调用,这个字符不是直接被写入该输出流所对应的物理文件中的,而是首先被插入到该流的缓存(buffer)中. 当缓存被排放出来(flush)时,它里面的所有数据或者被写入物理媒质中(如果是一个输出流的话),或者简单的被抹掉(如果是一个输入流的话).这个过程

java io流二-字符流输入输出缓冲区

/* 字符写入缓冲流 缓冲区的出现时为了提高流的操作效率. 所以在创建缓冲区之前,必须要现有流对象. Writer对应BufferedWriter Reader对应BufferedReader 该缓冲区中提供了一个换行符方法,newLine(); */ import java.io.*; class BufferedWriterDemo { public static void main(String[] args) throws IOException { FileWriter fw=new

socket缓冲区以及阻塞模式

socket缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区. write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器.一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情. TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到

c++中cout&lt;&lt;未刷新缓冲区及未遇endl便输出的问题

今天在mac的xcode上直接写cout<<未遇到enl以及未刷新缓冲区数据就不能输出. 记得以前在vs以及g++上都会直接输出,之后查阅的c++输入输出缓冲区刷新的问题,解决了这个矛盾. 缓冲区清空的情况: 1.程序正常结束.作为main返回工作的一部分,将清空所有的输出缓冲区. 2.在一些不确定的时候,缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新. 3.用操纵符显示地刷新缓冲区,如用endl. 4.在每次输出操作执行完毕后,用unitbuf操纵符设置流的内部状态,从而清

windows驱动程序wdf--KMDF获取应用程序数据缓冲区地址

有3种常用方式:METHOD_BUFFERED  METHOD_IN_DIRECT  METHOD_OUT_DIRECT 还有METHOD_NEITHER,<windows设备驱动WDF开发>描述为:源自win 9x的VxD的模式,不建议读者掌握.这个就不管了. METHOD_BUFFERED:无论读和写都对应同一缓冲区 METHOD_IN_DIRECT\ METHOD_OUT_DIRECT:输入缓冲区可作为附加输出缓冲区,输出缓冲区可作为附加输入缓冲区,两者区别只在DMA读写要分清,详见&l

流与缓冲区的理解

流的概念 流是一个 过程 ,一个 动态 的概念 (可以把流想象成水在水管中流动的过程,想象成商品快递运送的过程.cin和cout就是 执行 流这个过程的人) 流 负责 操作 缓冲区,输入输出流是 操作 的 实现 对于输入,cin负责把输入缓冲区中的内容传递给程序: 对于输出,cout负责把输出缓冲区中的内容传递给屏幕. (cin和cout把缓冲区的数据变成流,然后 搬运 到相应的目的地.cin和cout就是个 搬运工 , 搬运的过程 就是流) 程序 和 流源 或 流目标 之间的桥梁 使得C++程

Linux下串口编制【转】

串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准.串口通讯指的是计算机依次以位(bit)为单位来传送数据,串行通讯使用的范围很广,在嵌入式系统开发过程中串口通讯也经常用到通讯方式之一. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口