1. 程式人生 > >C語言(七)

C語言(七)

第七章  檔案

  • 7.1  C語言檔案的概念
    • 7.1.1 檔案的概念
      • 在此之前,所有的輸入和輸出只涉及到鍵盤和顯示器。在執行C程式時,我們通過鍵盤輸入資料並藉助顯示器把程式的運算結果顯示出來。但是,計算機作為一種先進的資料處理工具,它所面對的資料資訊量十分龐大,僅依賴於鍵盤輸入和顯示輸出等方式是遠遠不夠的。通常,解決的辦法是將這些資料記錄在某些介質上,利用這些介質的儲存特性,攜帶資料或長久地儲存資料。這種記錄在外部介質上的資料集合稱為“檔案”。
      • 在程式執行之前,常常需要將一些資料(執行的最終結果或中間資料)輸出到磁碟上儲存起來,以後需要時再從磁碟中輸入到計算機中,這就需要用到磁碟檔案。
      • C程式把檔案分為ASCII檔案和二進位制檔案。ASCII檔案又稱文字檔案,本章我們僅討論通過C程式的輸入輸出所涉及的、儲存在外部介質上的檔案,這類檔案通常稱為“資料檔案”,並以磁碟作為儲存介質。
      • 在程式中,當呼叫輸入函式從外部檔案中輸入資料賦給程式中的變數時,這種操作稱為“輸入”或“讀”;當呼叫輸出函式把程式中的變數的值輸出到外部檔案中時,這種操作稱為“輸出”或“寫”。
      • 在C語言中,檔案是一個位元組流或二進位制流,也就是說,對於輸入輸出的資料都按“資料流”的形式進行處理。輸出時,系統不新增任何資訊;輸入時,逐一讀入資料,直到遇到檔案結束標誌。C程式中的輸入輸出檔案,都以資料流的形式儲存在介質上。
      • 檔案輸入輸出方式也稱“存取方式”。C語言中,檔案有兩種存取方式:順序存取和直接存取。
        • 順序存取檔案的特點是:每當“開啟“檔案進行讀或寫操作時,總是從檔案的開頭開始,從頭到尾順序地讀寫。
        • 直接存取檔案的特點是:可以通過C語言的庫函式去指定開始讀(寫)的位元組號,然後直接對此位置上的資料進行讀(寫)操作。
    • 7.1.2 檔案型別指標
      • 檔案指標
        • 當使用一個檔案時,系統就為該檔案在記憶體中開闢一個區域來存放該檔案的相關資訊,如該檔案的名字、狀態、位置等,這些資訊都被儲存到由系統定義的名為FILE的一個結構體型別的變數中。可以用該結構體型別來定義檔案型別的指標變數,
      • 一般形式為:
        • FILE*fp;
          • fp是一個指向FILE結構體型別的指標變數。
  • 7.2 檔案的開啟與關閉
    • 概念
      • 對檔案進行讀寫操作時,首先要解決的問題是如何把程式中讀寫的檔案與磁碟上的實際資料檔案聯絡起來,接著就應該“開啟”檔案,在使用結束之後關閉檔案。
    • 7.2.1 fopen()函式
      • ANSI C規定了標準輸入輸出函式庫,用fopen()函式來開啟一個檔案,其一般的呼叫方式為:
        • FILE*fp;
        • fp=fopen(檔名,使用檔案方式);
          • 例如:
            • FILE*fp;
            • fp=fopen(“file1”,“r”);
          • 注意
            • fopen()函式中要有兩個字串作為引數。第一個字串中包含了進行讀寫操作的檔名,即用來指定所要開啟的檔案。本例中,指定檔名為file1。第二個字串中指定了檔案的使用方式,使用者可以根據這個引數來指定對檔案的使用意圖。本例中,使用檔案的方式為“r”讀入方式。
            • 若函式呼叫成功,函式返回一個FILE型別的指標,賦給檔案指標變數fp,從而把指標fp與檔案“file1“聯絡起來。也就是說,呼叫函式後,fp指向了檔案“file1”。
            • 使用檔案方式
              • (1)“r“方式開啟檔案時,只能進行讀操作,而不能進行寫或其他操作,而且該檔案必須已經存在。
              • (2)“w“方式開啟檔案時,只能對該檔案進行寫(即輸出檔案)操作,而不能用來向計算機中進行輸入操作。如果原來不存在該檔案,則在開啟時新建一個以指定的名字命名的檔案。如果已經存在一個以該檔名命名的檔案,則將從檔案的起始位置開始寫起,檔案原有內容將全部被刪除。
              • (3)以“a“方式開啟檔案時,是向該檔案的後面新增資料。如果指定的檔名不存在,系統將用在fopen()函式呼叫中指定的檔名建立一個新檔案;如果指定檔案已存在,則檔案中原有的內容將儲存,新的資料寫在原有內容之後。
              • (4)以“r+“、“w+“、“a+“方式開啟檔案時,既可以進行讀操作,同時也可以進行寫操作。用“r+“方式時開啟的檔案必須已經存在,以便能向計算機輸入資料。用“w+“方式則新建一個檔案,先向此檔案寫資料,然後可以讀此檔案中的資料。用“a+“方式開啟檔案時,原來的檔案不被刪除,只是在檔案尾部新增新的資料。
              • (5)“wb+“功能與“w+“相同,只是在隨後的讀和寫時,可以由位置函式設定讀和寫的起始位置。
              • (6)“ab+“功能與“a+“相同,只是在檔案尾部新增新的資料之後,可以由位置函式設定開始讀的起始位置。
    • 7.2.2 fclose()函式
      • 在對一個檔案進行讀寫操作後應該關閉它,以防止它再被誤用。
      • fclose()函式的功能就是關閉檔案,其一般形式為:
        • fclose(檔案指標);
          • 例如:
            • fclose(fp);
  • 7.3 檔案的讀寫
    • 概念
      • 檔案開啟之後,就可以對它進行讀寫了。
      • fputc()函式和fgetc()函式(putc()函式和getc()函式)
    • 7.3.1 fputc()函式
      • 該函式的功能是把一個字元寫到磁碟檔案上去,其一般呼叫形式為:
      • fputc(c,fp);
      • 其中c是要輸出的字元,fp是檔案指標。
    • 7.3.2 fgetc()函式
      • 該函式的功能是從指定的檔案中讀入一個字元,該檔案必須是以讀或讀寫方式開啟的。其一般呼叫形式為:
      • c=fgetc(fp);
      • fp為檔案型別指標變數,fgetc()函式帶回一個字元賦給c。
    • 7.3.3 fread()函式和fwrite()函式
      • 當要求一次性讀寫一組資料時,例如,一個實數或一個結構體變數的值,就可以使用fread()函式和fwrite()函式,它們的一般呼叫形式為:
      • fread(buffer,size,count,fp);
      • fwrite(buffer,size,count,fp);
      • 其中,buffer代表的是一個指標變數;size代表的是要讀寫的位元組數;count用來指定每讀寫一次,輸入或輸出資料塊的個數(每個資料塊具有size個位元組);fp是檔案型別指標。
    • 7.3.4 fscanf()函式和fprintf()函式
      • fscanf()函式和fprintf()函式都是格式化的讀寫函式,與scanf()和printf()函式作用相似,但fscanf()函式和fprintf()函式讀寫物件是磁碟檔案上的資料。它們的一般形式如下:
      • fscanf(檔案指標,格式字串,輸入列表);
      • fprintf(檔案指標,格式字串,輸出列表);
    • 7.3.5 fgets()函式
      • fgets()函式用來從檔案中讀入字串,呼叫形式如下:
      • fgets(str,n,fp);
      • 其中str是存放字串的起始地址,n是一個整型變數,fp是檔案指標。該函式的功能是從fp指向的檔案中讀入n-1個字元放入以str為起始的地址單元內。如果在讀完n-1個字元之前讀到換行符或EOF,則結束本次讀入操作。
    • 7.3.6 fputs()函式
      • fputs()函式是用來把字串輸出到檔案中,呼叫形式如下:
      • fputs(str,fp);
      • 其中str是要輸出的字元;fp是檔案指標,字串末尾的′\0′不輸出。
  • 7.4 檔案的定位
    • 概念
      • “檔案位置指標“和“檔案指標“是兩個完全不同的概念。檔案指標是在程式中定義的FILE型別的變數,通過fopen()函式,把檔案指標和某個檔案建立聯絡。C語言程式通過檔案指標實現對檔案的各種操作。檔案位置指標只是一個形象化的概念,我們將用檔案位置指標來表示當前讀或寫的資料在檔案中的位置。當開啟檔案時,可以認為檔案位置指標總是指向檔案的開頭,即第一個資料之前。當檔案位置指標指向檔案末尾時,表示檔案結束。
    • 7.4.1 rewind()函式
      • rewind()函式的呼叫形式如下:
      • rewind(fp);
      • 該函式的功能是使檔案的位置指標重新返回到檔案的開頭,其中fp為檔案指標,且該函式沒有返回值。
    • 7.4.2 fseek()函式和隨機讀寫
      • 如果控制好檔案的位置指標,就可以對流式檔案進行順序讀寫和隨機讀寫。fseek()函式的功能就是移動檔案位置指標到指定的位置,其一般的呼叫形式為:
      • fseek(檔案型別指標,位移量,起始點)
      • “位移量“指以“起始點“為基點,向前移動的位元組數。C語言要求位移量是long型資料,並規定在數字的末尾加一個字母L。
    • 7.4.3 ftell()函式
      • ftell()函式的作用是得到流式檔案中的當前位置,用相對於檔案開頭的位移量來表示。如果ftell()函式返回值為-1L,表示出錯。
    • 7.4.4 傳給main()函式的引數
      • 以前的學習中,我們在編寫main()函式時,其後一對圓括號是空的,沒有引數。其實,在支援C語言的環境中,可以在執行C程式時,通過執行C程式的命令列,把引數傳給C程式。main()函式通常可用兩個引數,例如:
      • main(intargc ,char  **argv)
      • {}
      • 其中argc和argv是兩個引數名,可由使用者自己命名。但是,它們的型別卻是固定的,第一個引數argc必須是整型;第二個引數argv是一個指向字元型的指標陣列的指標,這個字元型指標陣列的每個指標都指向一個字串。因此,第二個引數argv還可直接定義成基型別為字元型的指標陣列:
      • char*argv[];
      • 當我們對包含以上主函式的、名為myc的檔案進行編譯連線,生成名為myc.exe的可執行檔案後,即可在作業系統提示符下輸入以下命令執行該程式:
      • myc
      • 這就稱為命令列,myc即為執行程式的命令。這時argc中的值為1,argv[0]中將存放字串“myc“的首地址,即指向字串“myc“。