文件
文件的基本概念
文件的定義
所謂文件一般是指存儲在外部介質上的數(shù)據(jù)集合咏连。一批數(shù)據(jù)是以文件的形式存放在外部介質的祟滴。操作系統(tǒng)是以文件為單位對數(shù)據(jù)進行管理的歌溉。
按數(shù)據(jù)的組織方式,數(shù)據(jù)文件可以分為有結構文件和無結構文件兩類草慧。
- ①有結構文件也叫記錄式文件匙头。它以記錄為單位來保存數(shù)據(jù),每個記錄由若干個數(shù)據(jù)項(也稱字段)組成抖剿,每個數(shù)據(jù)項都規(guī)定其具有固定的長度识窿。例如, 數(shù)據(jù)庫文件是一種有結構文件缩宜。
- ②無結構文件也叫流式文件甥温。 它以字符流或二進制位流的形式保存數(shù)據(jù),即輸入輸出數(shù)據(jù)時都按“數(shù)據(jù)流"的形式進行處理姻蚓,整個文件就是一個字符流或二進制位流,記錄與記錄之間捂龄、字段與字段之間沒有界限。文件的存取以字符(字節(jié))或二進制位(bit)為單位倦沧,輸入輸出的數(shù)據(jù)流的開始和結束只受程序控制而不受物理符號(如回車換行符)的控制。
C語言使用的是流式文件窖认。常見的文本文件和二進制文件屬于流式文件告希。
ANSI C 標準對文件的處理方法是“緩沖文件系統(tǒng)”,系統(tǒng)為每個打開文件在內存中開辟一個緩沖區(qū)首装。寫文件時(從內存向磁盤輸出數(shù)據(jù))杭跪,先送到緩沖區(qū)中涧尿,當緩沖區(qū)裝滿后才送到磁盤中去檬贰。讀文件時,也經過緩沖區(qū)翁涤。這樣做是為了提高讀寫效率,因為磁盤訪問更耗時号阿,一次讀寫一塊數(shù)據(jù)鸳粉, 比每次讀寫單個字符更經濟。
文件指針
緩沖文件系統(tǒng)中枯夜,關鍵的概念是“文件指針”艰山。每個被用的文件都在內存中開辟一個區(qū),用來存放文件的名字、狀態(tài)摔吏、位置等有關信息鸽嫂,這些信息是保存在個結構體類型的變量中的溪胶。該結構體類型是由系統(tǒng)定義的稳诚,取名為FILE。有的C語言版本在stdio.h 文件中有以下類型定義才避。
typedef struct
{
int _fd; //文件號
int _cleft; //緩沖區(qū)中剩下的字符
int _mode; //文件操作模式
char *_nextc; //下一個字符位置
char *_buff; //文件緩沖區(qū)位置
}FILE氨距;
有了FILE類型之后,可以用它定義若干個FILE結構體類型的變量楞遏,以便存放若干個文件信息。
稱指向FILE結構體類型的變量為文件類型指針寡喝,稱為文件指針勒奇。定義文件指針的一般形式:
FILE * 指針變量名;
通常把打開文件的FILE結構的首地址賦給文件指針格二。
文件的操作
在文件操作時竣蹦,首先要打開文件,獲得對該文件的指針驶兜。通過該指針远寸,就可以獲取對文件進行操作所需的信息。將該指針傳遞給相應的庫函數(shù)肆资,庫函數(shù)就能通過這個信息,通過操作系統(tǒng)提供的文件系統(tǒng)調用郑原,來完成低級且復雜的硬件操作,如磁盤的讀與犯犁。
打開文件
在C語言中,調用庫函數(shù)fopen打開文件住诸。該函數(shù)的調用方式通常為:
FILE *fp; //fp為指針變量
fp= fopen(文件名涣澡,使用文件方式);
說明:
①函數(shù)的兩個參數(shù)“文件名”和“使用文件方式”均為字符串,其中表示文件名的字符串可以包含文件的存儲路徑奄薇,否則表示文件存儲在當前目錄下抗愁。
②使用文件的方式及其含義如表8-1所示。
例如:
FILE *fp;
fp= fopen("file.txt","r");
其意義是在當前目錄下打開文件file1.txt远搪,只允許進行“讀”操作,并使fp指向file.txt癞季。
FILE *fp;
fp= fopen("D:\\example\\file2.txt","w"); // 兩個反斜線\\中的第一個表示轉義字符
其意義是在example目錄下打開文件file2.txt,只允許進行“寫”操作,并使fp指向file2.txt志于。
考慮到出錯處理废睦,如果文件不存在,存取權限不夠等嗜湃,通常應判斷返回的值:
if(fp==NULL)
{
printf( "Opening file cror!n");
exit(0); //使用exit函數(shù)時,必須包含stdlib.h頭文件
}
關閉文件
文件使用完畢杖挣,必須將其關閉以免發(fā)生文件數(shù)據(jù)丟失等錯誤刚陡。
關閉文件可調用庫函數(shù)fclose來實現(xiàn)株汉。
該函數(shù)的使用格式通常為:
fclose(文件指針);
說明:
將文件指針與文件脫離聯(lián)系歌殃。如果成功進行關閉操作時,函數(shù)返回0,否則返回非0氓皱。
例如:
flose(fp); //關閉文件指針fp指向的文件