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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

fflush(stdin)和fflush(stdout)和rewind(stdin)的区别和作用

發(fā)布時(shí)間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 fflush(stdin)和fflush(stdout)和rewind(stdin)的区别和作用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

理解:fflush(stdin)和fflush(stdout)和rewind(stdin)
小結(jié)論(多謝網(wǎng)友zhao4zhong1為我解答疑難):
1、在每個(gè)最后不帶\n的printf后面加fflush(stdout);(對標(biāo)準(zhǔn)輸出流進(jìn)行清理,但是它并不是把數(shù)據(jù)丟掉,而是及時(shí)地打印數(shù)據(jù)到屏幕上。)
2、在每個(gè)不想受到輸入(接收)緩沖區(qū)舊內(nèi)容影響的scanf();【或者getchar();或者gets_s();】前面加rewind(stdin);(rewind()函數(shù)的作用是把文件的當(dāng)前位置指針指向文件頭。)
? ?或者添加fflush(stdin);(fflush(stdin)刷新標(biāo)準(zhǔn)輸入緩沖區(qū),把輸入緩沖區(qū)里的東西丟棄[非標(biāo)準(zhǔn)])
3、另外請注意檢查scanf的返回值。


一、fflush(stdin);函數(shù)
? ? ?fflush(stdin)比較容易理解,即清理標(biāo)準(zhǔn)輸入流,把多余的仍未被保存的數(shù)據(jù)丟掉。
比如,下面這個(gè)小程序:

 
  1. void main()

  2. {

  3. int a;

  4. char str[10];

  5. ?
  6. cin>>a;

  7. cout<<a<<endl

  8. ?
  9. ?
  10. // fflush(stdin),

  11. cin>>str;

  12. cout<<str<<endl;

  13. }


目地很簡單:從stdin獲得一個(gè)整數(shù)存入a,接著立馬打印出來;從stdin獲得一個(gè)字符串存入str,也立馬打印出來。但是下面這種可能需要特別考慮:在首行輸入了兩個(gè)整數(shù),在cin>>a之后,stdin緩沖還有一個(gè)整數(shù)沒被讀取。接下來,不等輸入字符串,就直接把上面多出來的數(shù)字存入到str中去并打印。
某種程度上這是操作不規(guī)范造成的,但是程序應(yīng)該要有健壯性,程序員應(yīng)該提前預(yù)防這種不規(guī)范的操作。可以在程序界面上提示“請輸入1個(gè)整數(shù)”,甚至有時(shí)候不厭其煩的強(qiáng)調(diào)和警告也必要。當(dāng)然,本例為求簡單,并不在UI友好方面做文章。這時(shí),可以在cin>>str語句前插入fflush(stdin),如此一來就可以清空標(biāo)準(zhǔn)輸入緩沖里多余的數(shù)據(jù)。


二、fflush(stdout);函數(shù)
小總結(jié):
fflush(stdout)刷新標(biāo)準(zhǔn)輸出緩沖區(qū),把輸出緩沖區(qū)里的東西打印到標(biāo)準(zhǔn)輸出設(shè)備上
printf("。。。。。。。。。。。");后面加fflush(stdout);可提高打印效率
fflush(stdout)跟fflush(stdin)類似,是對標(biāo)準(zhǔn)輸出流的清理,但是它并不是把數(shù)據(jù)丟掉,而是及時(shí)地打印數(shù)據(jù)到屏幕上。為了更好的理解它,需要知道一個(gè)事實(shí):標(biāo)準(zhǔn)輸出是以『行』為單位進(jìn)行的,也即碰到\n才打印數(shù)據(jù)到屏幕。這就可能造成延時(shí),如下面這幾行代碼:

 
  1. <span style="font-size:12px;">int a;

  2. ?
  3. printf_s("input one number:");

  4. fflush(stdout);\\#1

  5. ?
  6. scanf_s("%d",&a);</span>


如果沒有#1那行代碼,在某些平臺上就可能遲遲看不到"input one number"被打印到屏幕上來,因?yàn)樗鼪]有回車。這時(shí)候,fflush(stdout)就起到及時(shí)輸出的作用。
但是在Windows平臺上,似乎并看不出差別來。也即MSFT已經(jīng)將stdout的輸出改成及時(shí)生效了。
fflush函數(shù)被廣泛使用在多線程、網(wǎng)絡(luò)編程的消息處理中。
fflush(stdout):清空輸出緩沖區(qū),并把緩沖區(qū)內(nèi)容輸出


三、下面一段來自360搜索“fflush”:http://baike.so.com/doc/6745731.html
C和C++的標(biāo)準(zhǔn)里從來沒有定義過 fflush(stdin)。也許有人會說:“可是我用 fflush(stdin) 解決了這個(gè)問題,你怎么能說是錯(cuò)的呢?”的確,某些編譯器(如VC6)支持用 fflush(stdin) 來清空輸入緩沖,但是并非所有編譯器都要支持這個(gè)功能(linux下的gcc就不支持,經(jīng)我的GCC4.6.2測試),因?yàn)闃?biāo)準(zhǔn)中根本沒有定義 fflush(stdin)。
MSDN 文檔里也清楚地寫著:
fflush on input stream is an extension to the C standard (fflush 操作輸入流是對C標(biāo)準(zhǔn)的擴(kuò)充)。
以下是 C99 對 fflush 函數(shù)的定義:
int fflush(FILE *stream);
如果stream指向輸出流或者更新流(update stream),并且這個(gè)更新流最近執(zhí)行的操作不是輸入,那么fflush函數(shù)將把任何未被寫入的數(shù)據(jù)寫入stream指向的文件(如標(biāo)準(zhǔn)輸出文件stdout)。否則,fflush函數(shù)的行為是不確定的。fflush(NULL)清空所有輸出流和上面提到的更新流。如果發(fā)生寫錯(cuò)誤,fflush函數(shù)會給那些流打上錯(cuò)誤標(biāo)記,并且返回EOF,否則返回0。

由此可知,如果 stream 指向輸入流(如 stdin),那么 fflush 函數(shù)的行為是不確定的。故而使用 fflush(stdin) 是不正確的。(因此,我姑且得出一個(gè)結(jié)論:我們應(yīng)盡量使用rewind(stdin);來取代fflush(stdin);函數(shù),如此結(jié)論錯(cuò)誤,還請網(wǎng)友指正。)

?


四清空鍵盤緩沖區(qū)的一種好方法!?http://bbs.bccn.net/thread-248420-1-1.html
用 ?rewind(stdin);
語句可以達(dá)到很好的清空鍵盤緩沖區(qū)的作用。不用考慮太多其他因素。這是我在一本名為《軟件開發(fā):編程與設(shè)計(jì)(C語言版)》中所了解到的,作者是USA的David Conger。 ??
以前也了解到其他的清空鍵盤緩沖區(qū)的方法,如:用getchar();fflush(stdin);等。但感覺很麻煩,不好用,也不容易理解。而rewind(stdin)簡單好用,而且是一種可移植的方法。 ?
舉個(gè)例子: ?

 
  1. <span style="font-size:12px;">#include <stdio.h>

  2. int main()

  3. {

  4. int i;

  5. char aString[3];

  6. ?
  7. printf("Please enter some characters:"); /*先向鍵盤緩沖區(qū)里輸入無用字符*/

  8. getchar();

  9. rewind(stdin); /*清空鍵盤緩沖區(qū)里的無用字符*/

  10. printf("Please enter 'OK': "); /*輸入字符串“OK”*/

  11. for(i=0;i<2;i++) /*字符串a(chǎn)String接受字符串“OK”*/

  12. {

  13. aString[i]=getchar();

  14. }

  15. aString[i]='\0';

  16. puts(aString); /*輸出字符串a(chǎn)String*/

  17. return(0);

  18. } </span>


Microsof Visual C++下調(diào)試結(jié)果:
輸入:abcdefghijk回車OK回車?
輸出:OK ?之前緩沖區(qū)里的abcdefghijk垃圾字符都被清空了。?


下面向新手解釋一下rewind(stdin);的工作原理。
C語言把鍵盤,顯示器等設(shè)備當(dāng)做文件來處理,也就是說從鍵盤輸入相當(dāng)于從一個(gè)文件中讀入,向顯示器輸出相當(dāng)于向一個(gè)文件寫出。
而stdin是C標(biāo)準(zhǔn)庫定義的標(biāo)準(zhǔn)文件之一,它與鍵盤相關(guān)聯(lián)。我一般把它理解為指向鍵盤這個(gè)“文件”的指針。
而rewind()函數(shù)的作用是把文件的當(dāng)前位置指針指向文件頭。
兩者結(jié)合,rewind(stdin);的作用也就是把“指向鍵盤(一個(gè)文件)的指針從當(dāng)前位置挪到鍵盤(一個(gè)文件)開頭”,相當(dāng)于拋棄了當(dāng)前鍵盤緩沖區(qū)中的數(shù)據(jù),重新開始輸入。?
雖然并不是真正的把緩沖區(qū)里的數(shù)據(jù)全部清掉,但卻起到了清空鍵盤緩沖區(qū)的效果。

?

?

五、rewind(stdin)和fflush(stdin) 的有什么區(qū)別(意義,用法等等) ?:http://wenda.so.com/q/1378244901061364


語法上 ,?
rewind(stdin) 是把文件指針回繞到文件起始處。?
fflush(stdin) 是把文件輸入緩沖區(qū)清0。?
stdin 是標(biāo)準(zhǔn)輸入設(shè)備(輸入流),通常是鍵盤。(但也可以是通過轉(zhuǎn)向的文本文件。)?
------------?
昨天有人問,數(shù)入123,第2句輸入語句不能工作

 
  1. int a1;

  2. char s[20];

  3. scanf("%d",&a1); //第一句輸入語句

  4. scanf("%[^'\n']",s); // 第2句輸入語句

  5. printf("a1=%d\n s=%s\n",a1,s);


答:添上fflush(stdin); 就可以了。 ?
int a1; char s[20];?
scanf("%d",&a1); //第一句輸入語句?
rewind(stdin);?
// fflush(stdin);?
scanf("%[^'\n']",s); // 第2句輸入語句?
printf("a1=%d\n s=%s\n",a1,s);?
添上 fflush(stdin); 效果相同。

總結(jié)

以上是生活随笔為你收集整理的fflush(stdin)和fflush(stdout)和rewind(stdin)的区别和作用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。