程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 走進C標准庫(5)——"stdio.h"中的其他部分函數

走進C標准庫(5)——"stdio.h"中的其他部分函數

編輯:關於C語言

函數介紹來自: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相反,為了詳細介紹,將在後節給與說明。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved