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

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

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

CPP的输入输出流和缓冲区ios

c++输出缓冲区刷新c++

 

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

image

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

std::ios_base::sync_with_stdio(false);
    for(int i = 0 ; i < 10; i++)
    {
        cout<<"1 ";
        printf("2 ");
    }windows

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

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++最快的读取文件的方案.net

 

 

(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

相关文章
相关标签/搜索