這幾天參加中興捧月比賽,用到了c語言的標準io庫。由於對其中的一些細節不是非常清楚,導致了許多bug,花了好長時間來除錯。所以在此做個筆記,以備後查。
1. 緩衝區
全緩衝。在這種情況下,當填滿標準i/o快取後才進行實際i/o操作。對駐留在磁碟上的檔案的訪問通常是由標準i/o庫實施全緩衝的。 緩衝區可由標準io例程自動沖洗(如當填滿乙個緩衝區時),或呼叫函式fflush強制沖洗。
行緩衝。在這種情況下,當在輸入和輸出中遇到新行符時,標準i/o庫執行i/o操作,這允許我們一次輸出乙個字元(如fputc函式),但只有寫了一行之後才進行實際i/o操作。當流涉及乙個終端時(例如標準輸入和標準輸出),典型地使用行緩衝。
不帶緩衝。標準i/o庫不對字元進行緩衝。如果用標準i/o函式寫若干字元到不帶緩衝的流中,則相當於用write系統呼叫將這些字元寫到開啟的檔案上。標準出錯況stderr通常是不帶快取的,這就使得出錯資訊可以盡快顯示出來。
2. 開啟流
file *fopen(const char *filename, const char *type)
若成功,返回檔案指標;若失敗,返回null
這裡要注意引數type對開啟的流的讀寫的影響。
type 說明
r 為唯讀而開啟;檔案必須存在
w 為只寫而新建;若檔案已存在,將檔案內容截短至0
a 為在檔案尾端添寫而開啟;若檔案不存在,新建
r+ 為讀寫而開啟;檔案必須存在
w+ 為讀寫而新建;若檔案已存在,將檔案內容截短至0
a+ 為在檔案尾端讀和寫而開啟;若檔案不存在,新建。可通過fseek或rewind重定位檔案指標位置來讀,
但寫操作將把檔案指標移回到檔案尾端
使用字元b作為type的一部分,可以區分文字檔案和二進位制檔案。但有些系統不作區分,如unix。
當以讀寫方式開啟檔案時,即type中有「+」時,在輸出操作和輸入操作之間一定要有沖洗fflush或重定位fseek、fsetpos、rewind等操作。
3. 關閉流
int fclose(file *fp)
關閉流之前,沖洗緩衝區中的輸出資料,丟棄緩衝區中的任何輸入資料。
程序正常終止時,所有帶未寫緩衝資料的流被沖洗,所有的流被關閉。異常終止時,不保證沖洗緩衝區。
4. 二進位制io
size_t fread(void *buf, size_t size, size_t count, file *fp);
size_t fwrite(const void *buf, size_t size, size_t count, file *fp);
返回讀寫的物件數。
限制:只能用於讀在同一系統上已寫的資料。
apue
作者:iamzhaiwei
C語言標準I O
1 標準檔案 標準檔案 檔案指標 一般使用的裝置 標準輸入 stdin鍵盤 標準輸出 stdout 顯示器 標準出錯 stderr 顯示器 2 檔案操作函式 2.1 開啟檔案 include file fopen const char path,const char mode 引數說明 第乙個引數 ...
C語言標準IO
這幾天參加中興捧月比賽,用到了c語言的標準io庫。由於對其中的一些細節不是非常清楚,導致了許多bug,花了好長時間來除錯。所以在此做個筆記,以備後查。1.緩衝區 全緩衝。在這種情況下,當填滿標準i o快取後才進行實際i o操作。對駐留在磁碟上的檔案的訪問通常是由標準i o庫實施全緩衝的。緩衝區可由標...
C語言檔案IO操作(標準IO)
函式 file fopen const char path,const char mode 引數1 將要開啟的檔案路徑 引數2 開啟檔案的方式 1.r 唯讀的方式開啟 2.w 若檔案不存在則建立檔案,若存在此檔案則清空檔案內容並打卡 3.a 若檔案不存在則建立檔案,若存在則在末尾追加 不會清空原檔案...