<轉>C語言中的文件輸入輸出函數

 
C語言輸入輸出函數
      1. fopen()函數
      fopen函數用於打開文件, 其調用格式爲:
       FILE *fopen(char *filename, *type);
      在介紹這個函數之;前, 先了解一下下面的知識。
      (1) 流(stream)和文件(file)
      流和文件 在Turbo C2.0中是有區別的, Turbo C2.0 爲編程者和被訪問的設
備之間提供了一層抽象的東西, 稱之爲"流", 而將具體的實際設備叫作文件。
流是一個邏輯設備, 具備相同的行爲。所以, 用來進行磁盤文件寫的函數也一樣
能夠用來進行打印機的寫入。在Turbo C2.0中有兩種性質的流:     文字流( text
stream)和二進制(binary stream)。對磁盤來講就是文本文件和二進制文件。本
軟件爲了便於讓讀者易理解Turbo C2.0語言而沒有對流和文件做特別區分。
      (2) 文件指針FILE
      實際上FILE是一個新的數據類型。它是Turbo C2.0的基本數據類型的集合,
稱之爲結構指針。有關結構的概念將在第四節中詳細介紹, 這裏只要將FILE理解
爲一個包括了文件管理有關信息的數據結構, 即在打開文件時必須先定義一個文
件指針。
      (3) 之後介紹的函數調用格式將直接寫出形式參數的數據類型和函數返回值
的數據類型。例如: 上面打開文件的函數, 返回一個文件指針, 其中形式參數有
兩個, 均爲字符型變量(字符串數組或字符串指針)。
      如今再來看打開文件函數的用法。
      fopen()函數中第一個形式參數表示文件名, 能夠包含路徑和文件名兩部分。
如:
       "B:TEST.DAT"
       "C:\\TC\\TEST.DAT"
      若是將路徑寫成"C:\TC\TEST.DAT"是不正確的, 這一點要特別注意。
      第二個形式參數表示打開文件的類型。關於文件類型的規定參見下表。
                         表    文件操做類型
      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
            字符                  含義
      ────────────────────────────
             "r"             打開文字文件只讀
             "w"             建立文字文件只寫
             "a"             增補, 若是文件不存在則建立一個
             "r+"            打開一個文字文件讀/寫
             "w+"            建立一個文字文件讀/寫
             "a+"            打開或建立一個文件增補
             "b"             二進制文件(能夠和上面每一項合用)
             "t"             文這文件(默認項)
      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
      若是要打開一個CCDOS子目錄中, 文件名爲CLIB的二進制文件, 可寫成:
       fopen("c:\\ccdos\\clib", "rb");
      若是成功的打開一個文件, fo pen()函數返回文件指針,不然返回空指針(NULL)。由此可判斷文件打開是否成功。

      2. fclose()函數
      fclose()函數用來關閉一個由fopen()函數打開的文件 , 其調用格式爲:
        int fclose(FILE *stream);
      該函數返回一個整型數。當文件關閉成功時, 返回0, 不然返回一個非零值。
能夠根據函數的返回值判斷文件是否關閉成功。
      例10:
       #iclude<stdio.h>
       main()
       {
            FILE *fp;                  /*定義一個文件指針*/
            int i;
            fp=fopen("CLIB", "rb");    /*打開當前目錄名爲CLIB的文件只讀*/
            if(fp==NULL)               /*判斷文件是否打開成功*/
               puts("File open error");/*提示打開不成功*/
            i=fclose(fp);              /*關閉打開的文件*/
            if(i==0)                   /*判斷文件是否關閉成功*/
              printf("O.K");           /*提示關閉成功*/
            else
              puts("File close error");/*提示關閉不成功*/
       }html

      2、有關文件操做的函數
      本節所涉及到的文件讀寫函數均是指順序讀寫,即讀寫了一條信息後,指針自動
加1。下面分別介紹寫操做函數和讀操做函數。編程

      1. 文件的順序寫函數 
  fprintf()、fputs()和fputc()函數 均爲文件的順序寫操做函數,其調用格式以下:
      int fprintf(FILE *stream, char *format, <variable-list>);
      int fputs(char *string, FILE *steam);
      int fputc(int ch, FILE *steam);
      上述三個函數的返回值均爲整型量數組

fprintf() 函數的返回值爲實際寫入文件中的字符個數(字節數)。若是寫錯誤, 則返回一個負數數據結構

fputs()函數返回0時代表將string指針所指的字符串寫入文件中的操做成功, 返回非0時,代表寫操做失敗。函數

fputc()函數返回一個向文件所寫字符的值, 此時寫操做成功,不然返回EOF(文件結束結束其值爲-1, 在stdio.h中定義)表示寫操做錯誤。 
fprintf( ) 函數中格式化的規定與printf( ) 函數相同,所不一樣的只是fprintf()函數是向文件中寫入。而printf()是向屏幕輸出。
      下面介紹一個例子, 運行後產後一個test.dat的文件。
      例11:
       #include<stdio.h>
       main()
       {
            char *s="That's good news");    /*定義字符串指針並初始化*/
            int i=617;                      /*定義整型變量並初始化*/
            FILE *fp;                       /*定義文件指針*/
            fp=fopen("test.dat", "w");      /*創建一個文字文件只寫*/
            fputs("Your score of TOEFLis", fp);/*向所建文件寫入一串字符*/
            fputc(':', fp);                 /*向所建文件寫冒號:*/
            fprintf(fp, "%d\n", i);         /*向所建文件寫一整型數*/
            fprintf(fp, "%s", s);           /*向所建文件寫一字符串*/
            fclose(fp);                     /*關閉文件*/
       }
      用DOS的TYPE命令顯示TEST.DAT的內容以下所示:
      屏幕顯示
        Your score of TOEFL is: 617
        That's good news 
  2. 文件的順序讀操做函數
      fscanf()、fgets()和fgetc()函數
      函數fscanf()、fgets()和fgetc()均爲文件的順序讀操做函數, 其調用格式
以下:
       int fscanf(FILE *stream, char *format, <address-list>);
       char fgets(char *string, int n, FILE *steam);
       int fgetc(FILE *steam);
      fscanf()函數的用法與scanf()函數類似,只是它是從文件中讀到信息。
fscanf()函數的返回值爲EOF(即-1), 代表讀錯誤, 不然讀數據成功。spa

fgets()函數從文件中讀取至多n-1個字符(n用來指定字符數), 並把它們放入string指向的字符串中, 在讀入以後自動向字符串未尾加一個空字符, 讀成功返回string指針,
失敗返回一個空指針。
操作系統

fgetc()函數返回文件當前位置的一個字符,讀錯誤時返回EOF。
      下面程序讀取例11產生的test.dat文件, 並將讀出的結果顯示在屏幕上。
      例12
       #include<stdio.h>
       main()
       {
            char *s, m[20];
            int i;
            FILE    *fp;
            fp=fopen("test.dat", "r");      /*打開文字文件只讀*/
            fgets(s, 24, fp);               /*從文件中讀取23個字符*/
            printf("%s", s);                /*輸出所讀的字符串*/
            fscanf(fp, "%d", &i);           /*讀取整型數*/
            printf("%d", i);                /*輸出所讀整型數*/
            putchar(fgetc(fp));             /*讀取一個字符同時輸出*/
            fgets(m, 17, fp);               /*讀取16個字符*/
            puts(m);                        /*輸出所讀字符串*/
            fclose(fp);                     /*關閉文件*/
            getch();                        /*等待任一鍵*/
       }
      運行後屏幕顯示:
      Your score of TOEFL is: 617
      That's good news
      若是將上例中fscanf(fp, "%d", &i)改成fscanf(fp, "%s", m),    再將其後
的輸出語句改成printf("%s", m), 則可得出一樣的結果。因而可知Turbo C2. 0
中只要是讀文字文件, 則不管是字符仍是數字都將按其ASCII值處理。 另外還要
說明的一點就是fscanf()函數讀到空白符時, 便自動結束,(看樣子scanf是過不去空格這一關呀)在使用時要特別注意。.net

      3. 文件的隨機讀寫
      有時用戶想直接讀取文件中間某處的信息, 若用文件的順序讀寫必須從文件
頭開始直到要求的文件位置再讀, 這顯然不方便。Turbo C2.0提供了一組文件的
隨機讀寫函數, 便可以將文件位置指針定位在所要求讀寫的地方直接讀寫。
      文件的隨機讀寫函數以下:
      int fseek (FILE *stream, long offset, int fromwhere);
      int fread(void *buf, int size, int count, FILE *stream);
      int fwrite(void *buf, int size, int count, FILE *stream);
      long ftell(FILE *stream);
      fseek()函數的做用是將文件的位置指針設置到從fromwhere開始的第offset
字節的位置上, 其中fromwhere是下列幾個宏定義之一:
      文件位置指針起始計算位置fromwhere
━━━━━━━━━━━━━━━━━━━━━━━━━━━
      符號常數          數值             含義
───────────────────────────
      SEEK_SET            0          從文件開頭
      SEEK_CUR            1          從文件指針的現行位置
      SEEK_END            2          從文件末尾
━━━━━━━━━━━━━━━━━━━━━━━━━━━
      offset是指文件位置指針從指定開始位置(fromwhere指出的位置)跳過的字
節數。它是一個長整型量, 以支持大於64K字節的文件。fseek()函數通常用於對
二進制文件進行操做。
      當fseek()函數返回0時代表操做成功, 返回非0表示失敗。
      下面程序從二進制文件test_b.dat中讀取第8個字節。
      例13:
       #include<stdio.h>
       main()
       {
            FILE *fp;
            if((fp=fopen("test_b.dat", "rb"))==NULL)
              {
                printf("Can't open file");
                exit(1);
              }
            fseek(fp, 8. 1, SEEK_SET);
            fgetc(fp);
            fclose(fp);
       }
      fread()函數是從文件中讀count個字段, 每一個字段長度爲size個字節, 並把
它們存放到buf指針所指的緩衝器中。
      fwrite()函數是把buf指針所指的緩衝器中, 長度爲size個字節的count個字
段寫到stream指向的文件中去。
      隨着讀和寫字節數的增大, 文件位置指示器也增大, 讀多少個字節, 文件位
置指示器相應也跳過多少個字節。讀寫完畢函數返回所讀和所寫的字段個數。
      ftell()函數返回文件位置指示器的當前值,這個值是指示器從文件頭開始
算起的字節數, 返回的數爲長整型數, 當返回-1時, 代表出現錯誤。 unix

      下面程序把一個浮點數組以二進制方式寫入文件test_b.dat中。
      例14:
       #include <stdio.h>
       main()
       {
            float f[6]={3.2, -4.34, 25.04, 0.1, 50.56, 80.5};
                           /*定義浮點數組並初始化*/
            int i;
            FILE *fp;
            fp=fopen("test_b.dat", "wb"); /*建立一個二進制文件只寫*/
            fwrite(f, sizeof(float), 6, fp);/*將6個浮點數寫入文件中*/
            fclose(fp);                     /*關閉文件*/
       }
      下面例子從test_b.dat文件中讀100個整型數, 並把它們放到dat數組中。
      例15:
       #include <stdio.h>
       main()
       {
            FILE *fp;
            int dat[100];
            fp=fopen("test_b.dat", "rb");/*打開一個二進制文件只讀*/
            if(fread(dat, sizeof(int), 100, fp)!=100)
                                          /*判斷是否讀了100個數*/
              {
                 if(feof(fp))
                   printf("End of file"); /*不到100個數文件結束*/
                 else
                   printf("Read error");    /*讀數錯誤*/
            fclose(fp);                     /*關閉文件*/
       }
      注意:
      當用標準文件函數對文件進行讀寫操做時, 首先將所讀寫的內容放進緩衝區,
即寫函數只對輸出緩衝區進行操做, 讀函數只對輸入緩衝區進行操做。例如向一
個文件寫入內容, 所寫的內容將首先放在輸出緩衝區中, 直到輸出緩衝區存滿或
使用fclose()函數關閉文件時, 緩衝區的內容纔會寫入文件中。若無fclose()
函數, 則不會向文件中存入所寫的內容或寫入的文件內容不全。有一個對緩衝區
進行刷新的函數, 即fflush(), 其調用格式爲:
      int fflush(FILE *stream);
      該函數將輸出緩衝區的內容實際寫入文件中, 而將輸入緩衝區的內容清除掉。指針

      4. feof()和rewind()函數
      這兩個函數的調用格式爲:
       int feof(FILE *stream);
       int rewind(FILE *stream);
      feof()函數檢測文件位置指示器是否到達了文件結尾,如果則返回一個非0
值, 不然返回0。這個函數對二進制文件操做特別有用, 由於二進制文件中,文件結尾標誌EOF也是一個合法的二進制數,只簡單的檢查讀入字符的值來判斷文件是否結束是不行的。若是那樣的話, 可能會形成文件未結尾而被認爲結尾, 所
以就必須有feof()函數。
      下面的這條語句是經常使用的判斷文件是否結束的方法。
       while(!feof(fp))
          fgetc(fp);
      while爲循環語句, 將在下面介紹。
      rewind()函數用於把文件位置指示器移到文件的起點處, 成功時返回0,否 則, 返回非0值。   1.2.2    非標準文件函數       這類函數最先用於UNIX操做系統, ANSI標準未定義,     但有時也常常用到, DOS 3.0以上版本支持這些函數。它們的頭文件爲io.h。       1、文件的打開和關閉       1. open()函數       open()函數的做用是打開文件, 其調用格式爲:        int open(char *filename, int access);       該函數表示按access的要求打開名爲filename的文件, 返回值爲文件描述字, 其中access有兩部份內容: 基本模式和修飾符, 二者用" "("或")方式鏈接。修 飾符能夠有多個, 但基本模式只能有一個。access的規定如表3-2。                  表3-2    access的規定 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 基本模式      含義      修飾符           含    義 ──────────────────────────── O_RDONLY      只讀     O_APPEND     文件指針指向末尾 O_WRONLY      只寫     O_CREAT      文件不存在時建立文件,                                 屬性按基本模式屬性 O_RDWR        讀寫     O_TRUNC      若文件存在, 將其長度                                 縮爲0, 屬性不變                      O_BINARY     打開一個二進制文件                      O_TEXT       打開一個文字文件 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━       open()函數打開成功, 返回值就是文件描述字的值(非負值), 不然返回-1。      2. close()函數       close()函數的做用是關閉由open()函數打開的文件, 其調用格式爲:        int close(int handle);       該函數關閉文件描述字handle相連的文件。

相關文章
相關標籤/搜索