程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言標准IO

C語言標准IO

編輯:關於C

這幾天參加中興捧月比賽,用到了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
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved