C語(yǔ)言程序設(shè)計(jì)(第8章輸入輸出和文件系統(tǒng))

字號(hào):

8.1 緩沖文件系統(tǒng)
    緩沖文件系統(tǒng)的特點(diǎn)是:在內(nèi)存開辟一個(gè)“緩沖區(qū)”,為程序中的每一個(gè)文件使用,當(dāng)執(zhí)行讀文件的操作時(shí),從磁盤文件將數(shù)據(jù)先讀入內(nèi)存“緩沖區(qū)”,裝滿后再?gòu)膬?nèi)存“緩沖區(qū)”依此讀入接收的變量。執(zhí)行寫文件的操作時(shí),先將數(shù)據(jù)寫入內(nèi)存“緩沖區(qū)”,待內(nèi)存“緩沖區(qū)”裝滿后再寫入文件。由此可以看出,內(nèi)存“緩沖區(qū)”的大小,影響著實(shí)際操作外存的次數(shù),內(nèi)存“緩沖區(qū)”越大,則操作外存的次數(shù)就少,執(zhí)行速度就快、效率高。一般來(lái)說(shuō),文件“緩沖區(qū)”的大小隨機(jī)器而定。
    8.1.1 文件的打開與關(guān)閉
     任何關(guān)于文件的操作都要先打開文件,再對(duì)文件進(jìn)行讀寫,操作完畢后,要關(guān)閉文件。
    1. 文件類型指針
     人們?cè)诓僮魑募r(shí),通常都關(guān)心文件的屬性,如文件的名字、文件的性質(zhì)、文件的當(dāng)前狀態(tài)等。對(duì)緩沖文件系統(tǒng)來(lái)說(shuō),上述特性都是要仔細(xì)考慮的。ANSI C為每個(gè)被使用的文件在內(nèi)存開辟一塊用于存放上述信息的小區(qū),利用一個(gè)結(jié)構(gòu)體類型的變量存放。該變量的結(jié)構(gòu)體類型由系統(tǒng)取名為FILE,在頭文件stdio.h中定義如下:
    typedef struct{
     int_fd; /*文件號(hào)*/
     int_cleft; /*緩沖區(qū)中的剩余字符*/
     int_mode; /*文件的操作模式*/
     char *_next;/*下一個(gè)字符的位置*/
     char *_buff; /*文件緩沖區(qū)的位置*/
    }FILE;
     在操作文件以前,應(yīng)先定義文件變量指針:
     FILE *fp1,fp2;
     按照上面的定義,f p 1和f p 2均為指向結(jié)構(gòu)體類型的指針變量,分別指向一個(gè)可操作的文件,換句話說(shuō),一個(gè)文件有一個(gè)文件變量指針,今后對(duì)文件的訪問(wèn),會(huì)轉(zhuǎn)化為針對(duì)文件變量指針的操作。
    2. 文件的打開
     ANSI C 提供了打開文件的函數(shù):
     FILE *fopen(char *fname,char *mode)
     函數(shù)原型在stdio.h文件中,fopen( )打開一個(gè)fname指向的外部文件,返回與它相連接的流。fname是字符串,應(yīng)是一個(gè)合法的文件名,還可以指明文件路經(jīng)。對(duì)文件的操作模式由mode決定,mode也是字符串,由表8 - 1給出mode的取值表。
     表8-1 mode的取值表 Mode 含 義
    r 打開一個(gè)文本文件只讀
    w 打開一個(gè)文本文件只寫
    a 打開一個(gè)文本文件在尾部追加
    rb 打開一個(gè)只讀的二進(jìn)制文件
    wb 打開一個(gè)只寫的二進(jìn)制文件
    ab 對(duì)二進(jìn)制文件追加
    r+ 打開一個(gè)可讀/寫的文本文件
    w+ 創(chuàng)建一個(gè)新的可讀/寫的文本文件
    a+ 打開一個(gè)可讀/寫的文本文件
    rb+ 打開一個(gè)可讀/寫的二進(jìn)制文件
    wb+ 創(chuàng)建一個(gè)新的可讀/寫的二進(jìn)制文件
    ab 打開一個(gè)可讀/寫的二進(jìn)制文件
     如表8 - 1所示,文件的操作方式有文本文件和二進(jìn)制文件兩種,打開文件的正確方法如下
    例所示:
    #include
    FILE *fp;
    If((fp=fopen("test.txt","w"))==NULL)
    { /*創(chuàng)建一個(gè)只寫的新文本文件* /
     printf("cannot open file \n");
     exit(0);
    }
     這種方法能發(fā)現(xiàn)打開文件時(shí)的錯(cuò)誤。在開始寫文件之前檢查諸如文件是否有寫保護(hù),磁盤是否已寫滿等,因?yàn)楹瘮?shù)會(huì)返回一個(gè)空指針NULL,NULL值在stdio.h中定義為0。事實(shí)上打開文件是要向編譯系統(tǒng)說(shuō)明三個(gè)信息:①需要訪問(wèn)的外部文件是哪一個(gè)。②打開文件后要執(zhí)行讀或?qū)懠催x擇操作方式。③確定哪一個(gè)文件指針指向該文件。對(duì)打開文件所選擇的操作方式來(lái)說(shuō),一經(jīng)說(shuō)明不能改變,除非關(guān)閉文件后重新打開。是只讀就不能對(duì)其寫操作,對(duì)已存文件如以新文件方式打開,則信息必丟失。
    3. 文件的關(guān)閉
    ANSI C 提供了關(guān)閉文件的函數(shù):
    int fclose(FILE *stream)
    fclose( )函數(shù)關(guān)閉與stream相連接的文件,并把它的緩沖區(qū)內(nèi)容全部寫出。在fclose( )函數(shù)調(diào)用以后,流stream與此文件無(wú)關(guān),同時(shí)原自動(dòng)分配的緩沖區(qū)也失去定位。fclose( )函數(shù)關(guān)閉文件操作成功后,函數(shù)返回0;失敗則返回非零值。
    [例8-1] 打開和關(guān)閉一個(gè)可讀可寫的二進(jìn)制文件:
    #include
    main( )
    {
     FILE *fp;
     If ((fp=fopen("test.dat","rb"))==NULL)
     {
     printf("cannot open file\n");
     exit(0);
     }
     / *寫入對(duì)文件執(zhí)行讀寫的代碼 */
     if (fclose(fp)) printf("file close error!\n");
    }
    8.1.2 文件的讀寫
     當(dāng)文件按指定的工作方式打開以后,就可以執(zhí)行對(duì)文件的讀和寫。下面按文件的性質(zhì)分類進(jìn)行操作。針對(duì)文本文件和二進(jìn)制文件的不同性質(zhì),對(duì)文本文件來(lái)說(shuō),可按字符讀寫或按字符串讀寫;對(duì)二進(jìn)制文件來(lái)說(shuō),可進(jìn)行成塊的讀寫或格式化的讀寫。