在程序中,當調用輸入函數從外部文件中輸入數據賦給程序中的變量時,這種操作成為“輸入”或“讀”;當調用輸出函數把程序中變量的值輸出到外部文件中時,這種操作稱為“輸出”或“寫”。
C 語言中,對於輸入、輸出的數據都按“數據流”的形式進行處理。也就是說,輸出時,系統不添加任何信息;輸入時,逐一讀入數據,直到遇到 EOF 或文件結束標志就停止。C 程序中的輸入、輸出文件都以數據流的形式存儲在介質上。
對文件的輸入、輸出方式也稱為“存取方式”。C 語言中,有兩種對文件的存取方式:順序存儲和直接存取。
(1)順序存取文件的特點:每當“打開”這類文件,進行讀或寫操作時,總是從文件的開頭開始,從頭到尾順序讀或寫。也就是說,當順序存取文件時,要讀第 n 個字節,先要讀取前 n-1 個字節,而不能一開始就讀到第 n 個字節;要寫第 n 個字節,先要寫前第 n-1 個字節。
(2)直接存取文件又稱隨機存取文件,其特點是:可以通過調用 C 語言的庫函數去指定開始讀或寫的字節號,然後直接對此位置上的數據進行讀,或將數據寫到此位置上。
數據可以按文本形式或二進制形式存放在介質上,因此文件可以按數據的存放形式分為文本文件和二進制文件。
(1)所謂文本文件指的是,當輸出時,數據轉換成一串字符,每個字符以字符的 ASCII 碼值存儲到文件中,一個字符占一個字節。當用 printf 函數進行輸出時就進行了這樣的轉換,並在內部處理過程中指定輸出文件的終端為屏幕。反之當輸入時,又把指定的一串字符按類型轉換成數據,並存入內存,比如當調用 scanf 函數進行輸入時就進行了這種轉換,並在內部處理過程中指定輸入終端為鍵盤。
(2)當數據按二進制形式輸出到文件中時,數據不經過任何轉換、按計算機內的存儲形式直接存儲到硬盤上。也就是說,對於字符型數據,每個字符占一個字節;對於 int 類型數據,每個數據占兩個字節;float 類型的每個數據占四個字節。當從二進制文件讀入數據時,不必經過任何轉換,而直接將讀入的數據存入變量所占的內存空間。由此可以見,因為不存在轉換的操作,從而提高了對文件輸入輸出的速度。注意:不能將二進制數據直接輸出到終端屏幕,也不能從鍵盤輸入二進制數據。
ANSI 標准規定,在對文件進行輸入或輸出的時候,系統將為輸入或輸出文件開辟緩沖區。所謂“緩沖區”,是系統在內存中為各文件開辟的一片存儲區。當對某文件進行輸出時,系統首先把輸出的數據填入為該文件開辟的緩沖區內,每當緩沖區被填滿時,就把緩沖區中的內容一次性的輸出到對應文件中;當從某文件輸入數據時,首先將從輸入文件中輸入一批數據放入到該文件的內存緩沖區中,輸入語句將從該緩沖區中依次讀取數據,當該緩沖區中的數據被讀完時,將再從輸入文件中輸入一批數據放入。這種方式使得讀、寫操作不必頻繁地訪問外部設備,從而提高了讀、寫操作的速度。
文件指針實際上是指向一個結構體類型的指針,這個結構體中包含有諸如:緩沖區的地址、在緩沖區中當前存取的字符的位置、對文件是“讀”還是“寫”、是否出錯、是否已經遇到文件結束標志等信息。用戶不必去了解其中的細節,所有一切都在 stdio.h 頭文件中進行了定義。一般稱上面提到的結構體類型名為 FILE,定義文件類型指針變量的一般形式為:
FILE *指針變量名;
例如:
FILE *fp1, *fp2;
fp1 和 fp2 均被定義為指向文件類型的指針變量,稱為文件指針。