任何人都可以請解釋一下C中的fpurge(FILE *stream)
和fflush(FILE *stream)
之間的區別嗎? fflush()
和fpurge()
都會丟棄緩衝區中的所有未寫入或未讀取的數據。 請解釋這兩者之間的確切區別,以及它們的優缺點。int fpurge()和int fflush()之間的區別C
回答
要使用開始,兩者的功能清楚緩衝器(類型可操作緩衝器的下面討論),主要的區別是與存在於緩衝器中的數據會發生什麼。
- 對於
fflush()
,數據是被迫被寫入到磁盤。 - 對於
fpurge()
,數據是丟棄。
這就是說,fflush()
是一個標準的C功能,在C11
,章§7.21.5.2提及。
鑑於,fpurge()
是一種非便攜式和非標準功能。從man page
這些功能是非標準的,不便攜式。功能
fpurge()
在4.4BSD中引入,在Linux下不可用。 函數__fpurge()
在Solaris中引入,並且存在於 glibc 2.1.95及更高版本中。
這就是說,主要利用方不同的是,
調用
fflush()
與輸入流是undefined behavior。如果
stream
點到輸出流或在其中最近 操作未輸入的更新流,所述fflush
函數導致該stream
任何未寫入的數據被傳遞到主機環境將被寫入到文件; 否則,行爲是未定義的 。調用
fpurge()
與輸入流被定義。對於輸入流 此丟棄來自底層對象讀出,但通過
getc(3)
尚未 獲得的任何輸入;這包括通過ungetc(3)
推回的任何文字。
不過,嘗試堅持fflush()
。
「......既fflush
和fpurge
將丟棄在緩衝......任何未寫入或讀數據」:第
fflush
:功能
fflush
部隊通過流的底層寫入函數爲給定輸出或更新流寫入所有緩衝數據的。流的打開狀態不受影響。 如果流參數爲NULL
,則fflush
會刷新所有打開的輸出流。fpurge
:功能
fpurge
擦除給定的流中緩存的任何輸入或輸出。對於輸出流,這會丟棄任何未寫入的輸出。對於輸入流,這會丟棄從底層對象讀取但尚未通過getc
獲取的任何輸入。這包括通過ungetc
推回的任何文字。 (P.S .:也存在__fpurge
,它也是這樣做的,但沒有返回任何值)。
除了明顯作用,對緩衝數據,一個用在這裏你會發現其中的差別是輸入流。你可以用fpurge
這樣一個流(雖然它通常是一個錯誤,可能是概念上的)。根據環境的不同,輸入流可能不是fflush
(其行爲可能未定義,請參閱man page)。除了上面所述的區別外:1)如上所述(這可能非常有用),它們導致錯誤的案例不同,並且2)fflush
可以用單個語句處理所有輸出流。
至於利弊,我不會引用任何...他們只是工作不同(主要),所以你應該知道什麼時候使用每個。
除了功能差(你問的是什麼),還有一個便攜區別:fflush
是一個標準的功能,而fpurge
不是(和__fpurge
不是非此即彼)。
- 1. C#中char和int之間的區別#
- 2. int p = *(int *)i和int p = *(int *)&i之間的區別
- 3. 新的int和new(int)之間的C++有什麼區別?
- 4. '(int)a','a as int'和C#中的Convert.ToInt32(a)之間的區別
- 5. C++中新int()和新int {}之間的區別
- 6. int someInts [3]和int * someInts = new int [3]之間的區別?
- 7. uint和unsigned int之間的區別?
- 8. Python 3.5 - '//'和'int()'之間的區別
- 9. int,NSInteger和NSUInteger之間的區別
- 10. Java中的int a [5],int a [],int a [] = {2,3}之間的區別
- 11. foo(int * arr)和foo(int arr [])之間的任何區別?
- 12. int * p和int * p聲明之間的區別
- 13. 最終靜態int和靜態最終int之間的區別?
- 14. int [] []和int [,]之間的區別是什麼?
- 15. 返回值之間的區別int&和const int&
- 16. 傳遞(int x)和(const int x)之間的區別
- 17. 「Convert.ToString(Nullable <int>)」和「Nullable <int> .ToString()」之間的區別?
- 18. int(floatvar)和(int)floatvar之間是否有區別?
- 19. 表達式之間的區別:int * a = 0; int * a = 10;
- 20. 默認(int?)與(int?)之間的區別null
- 21. int(* ip)[4]與int ip [4]之間的區別?
- 22. extern int a之間的區別; extern int a = 42;
- 23. C#中long和int的區別?
- 24. 使用int [] []和int [,]有什麼區別?
- 25. int(1)和int(8)有什麼區別?
- 26. Android微調視圖:setSelection(int position)和setSelection(int position,boolean animate)之間的區別?
- 27. INT(10)和INT(12)之間有什麼區別(應用於我的代碼時)?
- 28. double a = a + int b和int a + = double b之間的區別是什麼?
- 29. swap(int&a,int&b)和swap(int * a,int * b)。有什麼區別?
- 30. CArray <int, int>和CArray <int, int&>有何區別?
從''fpurge()'](http://linux.die.net/man/3/fpurge)的Linux手冊頁判斷,'fpurge()'的一個問題是它是非標準的,源自BSD 4.4,因此無處不在。 Mac OS X(BSD)手冊頁描述了'fpurge()',但沒有提及它的出處 - 雖然它確實聲稱在同一頁上列出了'fseek()',但符合標準C(推理) fpurge()'不。 –
另請參見[如何從Unix系統上的tty輸入隊列中刷新數據?](https://stackoverflow.com/questions/10938882/) –