C/C 输入输出缓冲区
【導讀】:本文介紹C與C 輸入輸出緩沖的一些操作與特性。
以下是正文
(1)c 中cin、cout,cerr和c的stdin、stdout、stderr都是同步的,即iostream 對象和 and cstdio流是同步的,同步關系如下:
同步即表明我們可以在程序中混合用cout和printf或其他對應的流對??梢杂胹td::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?1linux下是:
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差不多。
?
(2)以下程序
for(int?i?=?0?;?i?<?10;?i ){????cout<<"1?";}????while(1);以上程序在windows下立即輸出10個1,linux下不輸出。說明windows下默認cout是無緩沖的(window可以通過cout<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);- EOF -
來源:JustDoIT
https://www.cnblogs.com/TenosDoIt/p/3733243.html
總結
以上是生活随笔為你收集整理的C/C 输入输出缓冲区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 眉山房管局备案查询网站(眉山房管局备案查
- 下一篇: 深入理解右值引用,move语义和完美转发