日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C/C 输入输出缓冲区

發布時間:2023/12/2 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?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差不多。

?

(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 输入输出缓冲区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。