fflush(stdin)和fflush(stdout)和rewind(stdin)的区别和作用
理解: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è)小程序:
-
void main() -
{ -
int a; -
char str[10]; - ?
-
cin>>a; -
cout<<a<<endl - ?
- ?
-
// fflush(stdin), -
cin>>str; -
cout<<str<<endl; -
}
目地很簡單:從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í),如下面這幾行代碼:
-
<span style="font-size:12px;">int a; - ?
-
printf_s("input one number:"); -
fflush(stdout);\\#1 - ?
-
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è)例子: ?
-
<span style="font-size:12px;">#include <stdio.h> -
int main() -
{ -
int i; -
char aString[3]; - ?
-
printf("Please enter some characters:"); /*先向鍵盤緩沖區(qū)里輸入無用字符*/ -
getchar(); -
rewind(stdin); /*清空鍵盤緩沖區(qū)里的無用字符*/ -
printf("Please enter 'OK': "); /*輸入字符串“OK”*/ -
for(i=0;i<2;i++) /*字符串a(chǎn)String接受字符串“OK”*/ -
{ -
aString[i]=getchar(); -
} -
aString[i]='\0'; -
puts(aString); /*輸出字符串a(chǎn)String*/ -
return(0); -
} </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句輸入語句不能工作
-
int a1; -
char s[20]; -
scanf("%d",&a1); //第一句輸入語句 -
scanf("%[^'\n']",s); // 第2句輸入語句 -
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fprintf()中的stderr解析
- 下一篇: OpenGL学习脚印: 投影矩阵和视口变