函數介紹來自:http://ganquan.info/standard-c/
函數名: freopen
功 能: 替換一個流
用 法: FILE *freopen(char *filename, char *type, FILE *stream);
FILE * _TSCHAR * _TSCHAR * FILE * REG1 FILE * FILE * _ASSERTE(filename != _ASSERTE(*filename != _T( _ASSERTE(mode != _ASSERTE(str != stream = stream->_ptr = stream->_base = stream->_cnt = stream->_flag = retval = }
調用_fclose_lk斷開流stream與文件的連接,然後將stream中的變量恢復到初始狀態,並釋放其中分配的緩沖區。最後調用_openfile重新建立新的文件描述符以及文件句柄之間的連接。
函數名: fclose() 功 能: 關閉一個流。 用 法: int fclose(FILE *stream);
FILE * REG1 FILE * REG2 result = stream = (stream->_flag & stream->_flag = /* _MT */ _ASSERTE(str != result = (_close(_fileno(stream)) < result = ( stream->_tmpfname != _free_crt(stream-> stream->_tmpfname = stream->_flag = }
調用_freebuf,將stream中的變量恢復到初始狀態,都是釋放其中分配的緩沖區。然後調用_close(_fileno(stream)),在文件描述符管理單元刪除該文件描述符,並調用CloseHandle關閉在操作系統中打開的文件句柄。如果有臨時文件名被使用,也釋放掉。
函數名: feof
功 能: 檢測流上的文件結束符
用 法: int feof(FILE *stream);
FILE * ( ((stream)->_flag & }
返回檢測stream->_flag是否被標記了_IOEOF,該標記在其它函數中遇到EOF情形時被添加。
函數名: ferror
功 能: 檢測流上的錯誤
用 法: int ferror(FILE *stream);
FILE * ( ((stream)->_flag & }
返回檢測stream->_flag是否被標記了_IOERR。
函數名: fflush
功 能: 清除文件緩沖區,文件以寫方式打開時將緩沖區內容寫入文件
用 法: int fflush(FILE *stream);
REG1 FILE * ( str == (_flush(str) != (str->_flag & (_commit(_fileno(str)) ? EOF : ( }
當傳入fflush中的stream為NULL時,則_fflush所有寫的流。否則,_fflush當前stream,成功的話,調用_commit寫入到硬盤中。
flsall中FFLUSHNULL參數意義如下:
/*
* FFLUSHNULL functionality: fflush the write
* stream and kept track of the error, if one
* occurs
*/
在_fflush()函數中會使用:
stream->_ptr = stream->_base;
stream->_cnt = 0;
將緩沖區清空。
如果stream僅具有寫標記且buffer已成功分配(if ((stream->_flag & (_IOREAD | _IOWRT)) == _IOWRT && bigbuf(stream) && (nchar = stream->_ptr - stream >_base) > 0))的話,則調用_write將緩沖區裡的內容寫到相關的文件句柄中。
注意,操作系統為了減少讀寫硬盤的次數,也會建立文件緩沖區,並不立刻將數據寫入文件,而是先把數據累計到緩沖區,再以塊為單位批量輸出到文件中。
_write中調用的WriteFile就是將相關內容寫到了文件句柄對應的緩沖區中。這一點可以從putc函數產生的現象看到。當執行一句putc語句時,內容並沒有馬上被寫入到流對應的文件中的。
而fflush會強制將I/O控制塊緩沖區的內容寫入到硬盤中。這就通過在_commit中調用FlushFileBuffers,強行將文件句柄對應的緩沖區的內容寫入到了硬盤中。
函數名: fgetpos
功 能:取得當前文件的指針所指的位置,並把該指針所指的位置數存放到pos所指的對象中。pos值以內部格式存儲,僅由fgetpos和fsetpos使用。其中fsetpos的功能與fgetpos相反,為了詳細介紹,將在後節給與說明。