2016-05-31 179 views
6

任何人都可以請解釋一下C中的fpurge(FILE *stream)fflush(FILE *stream)之間的區別嗎? fflush()fpurge()都會丟棄緩衝區中的所有未寫入或未讀取的數據。 請解釋這兩者之間的確切區別,以及它們的優缺點。int fpurge()和int fflush()之間的區別C

+0

從''fpurge()'](http://linux.die.net/man/3/fpurge)的Linux手冊頁判斷,'fpurge()'的一個問題是它是非標準的,源自BSD 4.4,因此無處不在。 Mac OS X(BSD)手冊頁描述了'fpurge()',但沒有提及它的出處 - 雖然它確實聲稱在同一頁上列出了'fseek()',但符合標準C(推理) fpurge()'不。 –

+0

另請參見[如何從Unix系統上的tty輸入隊列中刷新數據?](https://stackoverflow.com/questions/10938882/) –

回答

2

要使用開始,兩者的功能清楚緩衝器類型可操作緩衝器的下面討論),主要的區別是與存在於緩衝器中的數據會發生什麼。

  • 對於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()

+2

輸入流上的'fflush'可能由ISO C保留而未定義,但它由POSIX指定。這個效果與'fpurge'引用的效果類似,只是它只能處理* seekable *輸入流 - 即它可以用來確保陳舊的數據沒有從磁盤文件中緩存,但不能丟棄從管道或tty緩存的數據。 – hobbs

+0

Ref:http://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html – hobbs

+0

@hobbs對,但仍然是實現定義。 –

4

「......既fflushfpurge將丟棄在緩衝......任何未寫入或讀數據」:第

  • fflush

    功能fflush部隊通過流的底層寫入函數爲給定輸出或更新流寫入所有緩衝數據的。流的打開狀態不受影響。 如果流參數爲NULL,則fflush會刷新所有打開的輸出流。

  • fpurge

    功能fpurge擦除給定的流中緩存的任何輸入或輸出。對於輸出流,這會丟棄任何未寫入的輸出。對於輸入流,這會丟棄從底層對象讀取但尚未通過getc獲取的任何輸入。這包括通過ungetc推回的任何文字。 (P.S .:也存在__fpurge,它也是這樣做的,但沒有返回任何值)。

除了明顯作用,對緩衝數據,一個用在這裏你會發現其中的差別是輸入流。你可以用fpurge這樣一個流(雖然它通常是一個錯誤,可能是概念上的)。根據環境的不同,輸入流可能不是fflush(其行爲可能未定義,請參閱man page)。除了上面所述的區別外:1)如上所述(這可能非常有用),它們導致錯誤的案例不同,並且2)fflush可以用單個語句處理所有輸出流。

至於利弊,我不會引用任何...他們只是工作不同(主要),所以你應該知道什麼時候使用每個。

除了功能差(你問的是什麼),還有一個便攜區別:fflush是一個標準的功能,而fpurge不是(和__fpurge不是非此即彼)。

這裏您有相應的手冊頁(fflush,fpurge)。

相關問題