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

相關文章
相關標籤/搜索