C Primer Plus (第五版)中文版——第 13 章 檔案輸入/輸出
13.1 和檔案進行通訊
13.1.1 檔案是什麼
一個檔案(file)通常就是磁碟上的一段命名的儲存區。C 將檔案看成是連續的位元組序列,其中沒一個位元組單獨地讀取。ANSI C 提供了檔案的兩種檢視:文字檢視、二進位制檢視。
13.1.2 文字檢視和二進位制檢視
在二進位制檢視中,檔案的每個位元組都可以為程式所訪問。在文字檢視中,程式看到的內容和檔案的內容有可能不同。
MS-DOS區分文字檔案和二進位制檔案,C 提供的是文字和二進位制檢視。通常,對於文字檔案使用文字檢視,對於二進位制檔案使用二進位制檢視。
13.1.3 I/O 級別
I/O 級別即處理檔案存取的級別。分為:
- 低階 I/O:使用作業系統提供的基本 I/O 服務。
- 標準高階 I/O:使用一個標準的 C 庫函式包和 stdio.h 標頭檔案中的定義。
ANSI C 只支援標準 I/O 包。
13.1.4 標準檔案
C 程式為您自動開啟3個檔案:
- 標準輸入:預設是系統的一般輸入裝置,通常為鍵盤。標準輸入是常用的程式輸入物件,為 getchar()、gets()、scanf() 所使用。
- 標準輸出:預設是系統的一般輸出裝置,通常為顯示器。標準輸出是常用的程式輸出物件,為 putchar()、puts()、printf() 所使用。
- 標準錯誤輸出:預設是系統的一般輸出裝置,通常為顯示器。標準錯誤輸出提供一個可供傳送錯誤資訊的邏輯上不同的位置。
說明:
- 如果使用重定向方法將輸出傳送到一個檔案中而不是螢幕上,傳送到標準錯誤輸出的輸出內容仍然會被髮送到螢幕上。
13.2 標準 I/O
除了可移植性之外,標準 I/O 包相對於低階 I/O 有兩點優勢:
- 標準 I/O 包中包含很多專用的函式,可以方便地處理不同的 I/O 問題。
- 對輸入和輸出進行了緩衝。即大塊地轉移資訊,而不是每次一個位元組進行轉移,這種緩衝大大提高了資料傳輸率。
13.2.1 檢查命令列引數
程式檢查 argc 的值,檢視是否有命令列引數。如果沒有,程式列印一條用法提示後退出。
if(argc != 2)
{
printf("Useage:%s filename",argv[0]);
exit(EXIT_FAILURE);
}
13.2.2 fopen() 函式
fopen() 函式用於開啟檔案。該函式在 stdio.h 中宣告,它接受兩個引數:
- 第一個引數是要開啟的檔名,更確切地說,是包含該檔名的字串的地址。
- 第二個引數是用於指定檔案開啟模式的一個字串。
模式字串 | 意義 |
"r" | 開啟一個文字檔案,可以讀取檔案。 |
"w" | 開啟一個文字檔案,可以寫入檔案。如果該檔案存在則先將檔案的長度截為零;如果不存在則先建立之。 |
"a" | 開啟一個文字檔案,可以寫入檔案。向已有檔案的尾部追加內容,如果該檔案不存在則先建立之。 |
"r+" | 開啟一個文字檔案,可以進行更新。可以讀取和寫入檔案。 |
"w+" | 開啟一個文字檔案,可以進行更新。如果該檔案存在則先將檔案的長度截為零;如果不存在則先建立之。 |
"a+" | 開啟一個文字檔案,可以進行更新。向已有檔案的尾部追加內容,如果該檔案不存在則先建立之。可以讀取整個檔案,但寫入時只能追加內容。 |
"rb"、"wb"、"ab"、 "rb+"、"r+b"、 "wb+"、"w+b"、 "ab+"、"a+b" |
與前面的模式相似,只是使用二進位制模式而非文字模式開啟檔案 |
程式開啟一個檔案後,fopen() 函式返回一個檔案指標(file pointer),其他 I/O 函式用這個指標來指定該檔案。檔案指標 fp 是一種指向 FILE 的指標;FILE 是 stdio.h 中定義的一種派生型別。
程式沒能開啟檔案時,fopen() 函式返回空指標。如果 fp 為 NULL,程式將推出。
13.2.3 getc() 函式和 putc() 函式
使用 getc() 函式和 putc() 函式時,需要告訴它們要使用的檔案。
- 從指標 fp 指定的檔案中獲得一個字元:ch = getc(fp);
- 將字元 ch 寫入到 FILE 指標 fpout 指定的檔案中:putc(ch,fpout);
13.2.4 檔案結尾
如果在嘗試讀取字元時發現已經達到檔案結尾,getc() 函式會返回一個特殊值 EOF。為了避免讀取空檔案帶來的問題,應對檔案輸入使用入口條件迴圈,且在進入迴圈體之前嘗試進行第一次讀取。
//設計範例
int ch; //int來控制EOF
FILE *fp;
fp = fopen("wacky.xt","r");
ch = getc(fp); //獲取初始輸入
while(ch!=EOF)
{
putchar(ch); //處理輸入
ch=getc(fp); //獲取下一個輸入
}
13.2.5 fclose() 函式
fclose(fp) 關閉指標 fp 指定的檔案,同時根據需要重新整理緩衝區。如果檔案成功關閉,fclose() 函式將返回值0,否則返回 EOF。
13.2.6 標準檔案指標
標準檔案 | 檔案指標 | 一般使用的裝置 |
標準輸入 | stdin | 鍵盤 |
標準輸出 | stdout | 顯示器 |
標準錯誤輸出 | stderr | 顯示器 |