1. 程式人生 > >C Primer Plus (第五版)中文版——第 13 章 檔案輸入/輸出

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 中宣告,它接受兩個引數:

  • 第一個引數是要開啟的檔名,更確切地說,是包含該檔名的字串的地址。
  • 第二個引數是用於指定檔案開啟模式的一個字串。
fopen() 函式的模式字串
模式字串 意義
"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 顯示器