複製鏈接
請複製以下鏈接發送給好友

fflush

鎖定
fflush是一個在C語言標準輸入輸出庫中的函數,功能是沖洗流中的信息,該函數通常用於處理磁盤文件。fflush()會強迫將緩衝區內的數據寫回參數stream 指定的文件中。
中文名
刷新輸出
外文名
fflush
頭文件
stdio.h
原    型
int fflush(FILE *stream)
功 能
清除讀寫緩衝區

fflush程序簡介

函數名: fflush
功 能: 清除讀寫緩衝區,在需要立即把輸出緩衝區的數據進行物理寫入時
頭文件:stdio.h
fflush fflush
原型:int fflush(FILE *stream)
其中stream是要衝洗的流

fflush函數説明

如果指針指向一個輸出流或者是一個最近的一次操作不是輸入的更新流,輸出刷新將會創造任意未寫入的數據給將要被寫入文件的流和最近的數據被修改流,並且最後的文件狀態改變應該被標記為更新的基礎文件的時間戳。
對於打開以使用基礎文件描述進行讀取的流,如果文件尚未處於EOF,並且該文件是能夠搜索的文件,則基礎打開文件描述的文件偏移量應設置為流的文件位置,並且任何未被從流中讀取的ungetc()或ungetwc()推回到流上的字符都將被丟棄(不再進一步改變文件偏移量)。 [選項結束]
如果stream是空指針,則fflush()將對上面定義了行為的所有流執行此刷新操作。 [1] 

fflush程序例子

#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<io.h>
void flush(FILE *stream);
int main(void)
{
    FILE *stream;
    char msg[]="Thisisatest";
    /*createafile*/
    stream=fopen("DUMMY.FIL","w");
    /*writesomedatatothefile*/
    fwrite(charmsg,strlen(charmsg),1,stream);
    clrscr();
    printf("PressanykeytoflushDUMMY.FIL:");
    getch();
    /*flushthedatatoDUMMY.FILwithout\
      closingit*/
    flush(stream);
    printf("\nFilewasflushed,Pressanykey\toquit:");
    getch();
    return 0;
}

void flush(FILE* stream)
{
    int duphandle;
    /*flushthestream'sinternalbuffer*/
    fflush(stream);
    /*makeaduplicatefilehandle*/
    duphandle=dup(fileno(stream));
    /*closetheduplicatehandletoflushtheDOSbuffer*/
    close(duphandle);
}

fflush返回值

如果成功刷新,fflush返回0。指定的流沒有緩衝區或者只讀打開時也返回0值。返回EOF指出一個錯誤。
注意:如果fflush返回EOF,數據可能由於寫錯誤已經丟失。當設置一個重要錯誤處理器時,最安全的是用setvbuf函數關閉緩衝或者使用低級I/0例程,如open、close和write來代替流I/O函數。

fflush其他用法

fflush(stdin)刷新標準輸入緩衝區,把輸入緩衝區裏的東西丟棄[非標準]
fflush(stdout)刷新標準輸出緩衝區,把輸出緩衝區裏的東西打印到標準輸出設備上

fflush注意事項

C和C++的標準裏從來沒有定義過 fflush(stdin)。也許有人會説:“可是我用 flush(stdin) 解決了這個問題,你怎麼能説是錯的呢?”的確,某些編譯器(如VC6)支持用 fflush(stdin) 來清空輸入緩衝,但是並非所有編譯器都要支持這個功能(linux下的gcc就不支持,經我的GCC4.6.2測試),因為標準中根本沒有定義fflush(stdin)。
MSDN 文檔裏也清楚地寫着:
fflush on input stream is an extension to the C standard (fflush 操作輸入流是對C標準的擴充)。
以下是 C99 對 fflush 函數的定義:
int fflush(FILE *stream);
如果stream指向輸出流或者更新流(update stream),並且這個更新流最近執行的操作不是輸入,那麼fflush函數將把任何未被寫入的數據寫入stream指向的文件(如標準輸出文件stdout)。否則,fflush函數的行為是不確定的。fflush(NULL)清空所有輸出流和上面提到的更新流。如果發生寫錯誤,flush函數會給那些流打上錯誤標記,並且返回EOF,否則返回0。
由此可知,如果 stream 指向輸入流(如 stdin),那麼 fflush 函數的行為是不確定的。故而使用 fflush(stdin) 是不正確的。
參考資料