116.C語言_文件

第七章  文件node

  • 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「。

 

 

 

相關文章
相關標籤/搜索