關於緩衝區的詳細介紹,請參考html
C++編程對緩衝區的理解linux
c++輸出緩衝區刷新c++
(1)c++中cin、cout,cerr和c的stdin、stdout、stderr都是同步的,即iostream 對象和 and cstdio流是同步的,同步關係以下:編程
同步即代表咱們能夠在程序中混合用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)咱們能夠經過函數setbuf 和 setvbuf 本身設置輸入輸出流的緩衝區,須要注意的是無論程序中申請的的緩衝區實際大小爲多少,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