weidagang2046的專欄

          物格而后知致
          隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
          數據加載中……

          C語言中對文件的隨機存取

          C語言中對文件的隨機存取
          C語言中要實現對文件的隨機存 取,需要用到兩個函數fseek()、ftell()。下面通過 一個反轉顯示指定文件的程序來介紹這兩個函數的用法。
          r eserve.c:





          #include <
          stdio.h>
          #include <
          stdlib.h>


          #define CNTL_Z '\032' / /DOS 文本中的文件結尾標記
          #define SL EN 50

          int main(int arg c, char *argv[])
          {
          c har file[SLEN];

          char ch ;

          FILE *fp;

          long count, last;


          p uts("Enter the name of the fil e to be processed: ");

          gets(file);

          if( (fp = f open(file, "rb")) == NULL ) //只讀和二進制模式
          {
          printf("reverse can't open %s\n", file);

          exit( 1);

          }

          f seek(fp, 0L, SEEK_SET);
          //定位在文件開頭處
          la st = ftell(fp);

          printf( "fseek(fp, 0L, SEEK_SET) , fte el(p): %d\n", last);

          fseek(fp, 0L, SEEK_END);
          //定位在文件結尾處
          last = ftell(fp);

          printf("fseek(fp, 0L, SEEK_END ) , fteel(p): %d\n", last);


          for(count = 1L;
          c ount <
          = last;
          count++)
          {
          fseek(fp, -cou nt, SEEK_END);

          ch = getc(fp);


          if(ch != CNTL_Z &
          &
          ch != '\r')
          {
          putchar(ch);

          }
          }
          putchar ('\n');

          fclose(fp);


          system("PAUSE");

          return 0;

          }

          假定一個文 件test.txt內容為:





          1234567890
          12345678 90
          1234567890
          1111111112
          2222222223
          3333333334
          執行reserve來進行反轉顯示:
          < br>



          Enter the n ame of the file to be processe d:
          test.txt
          fseek(fp, 0L , SEEK_SET) , fteel(p): 0
          f seek(fp, 0L, SEEK_END) , fteel (p): 72

          4333333333
          3222222222
          2111111111
          09 87654321
          0987654321
          0987 654321

          下面,我們來解釋一下fseek ()和ftell()是如何工作的。
          l fseek()函數




          fseek(移動文件流的讀寫位置)


          相 關函數

          rewind,ftell,fgetp os,fsetpos,lseek


          表頭 文件

          #include<
          stdio.h >



          定義函數

          i nt fseek(FILE * stream,long of fset,int whence);



          函 數說明

          fseek()用來移動文件流的讀寫位 置。參數stream為已打開的文件指針,參數offset為根 據參數whence來移動讀寫位置的位移數。

          < br>參數

          whence為下列其中一種:SE EK_SET從距文件開頭offset位移量為新的讀寫位置。S EEK_CUR 以目前的讀寫位置往后增加offset個位移量 。SEEK_END將讀寫位置指向文件尾后再增加offset個 位移量。當whence值為SEEK_CUR 或SEEK_EN D時,參數offset允許負值的出現。下列是較特別的使用方式 :1) 欲將讀寫位置移動到文件開頭時:fseek(FILE *stream,0,SEEK_SET);
          2) 欲將讀寫位置移 動到文件尾時:fseek(FILE *stream,0,0S EEK_END);



          返回值
          < br>當調用成功時則返回0,若有錯誤則返回-1,errno會 存放錯誤代碼。


          附加說明
          fseek()不像lseek()會返回讀寫位置,因此必須 使用ftell()來取得目前讀寫的位置。

          l ftell()函數




          ftell(取得文件流的讀取位置)
          < br>
          相關函數

          fseek,rewi nd,fgetpos,fsetpos


          表頭文件

          #include<
          stdio .h>



          定義函數

          long ftell(FILE * stream);



          函數說明

          ftell()用 來取得文件流目前的讀寫位置。參數stream為已打開的文件指 針。


          返回值

          當調用成 功時則返回目前的讀寫位置,若有錯誤則返回-1,errno會存 放錯誤代碼。


          錯誤代碼

          EBADF 參數stream無效或可移動讀寫位置的文件流。


          范例

          參考fseek ()。

          通過fseek()、ftell()兩 個函數,我們就可以隨意訪問文件的任何位置了,想了想好像操作文 件就這么easy,實在也沒有更多可說的了。對了,fseek( )和ftell()存在一個潛在的問題就是他們限制文件的大小只 能在long類型的表示范圍以內,也就是說通過這種方式,只能打 開2,000,000,000字節的文件,不過在絕大多數情況下 似乎也已經夠用了。如果需要打開更大的文件,你需要用到fget pos()、fsetpos()函數了,那是另一個命題了。

          from: http://www.aonet.cn/artical/26/2005045581.htm

          posted on 2007-01-05 10:49 weidagang2046 閱讀(1868) 評論(0)  編輯  收藏 所屬分類: C/C++

          主站蜘蛛池模板: 牙克石市| 盐池县| 阿巴嘎旗| 罗甸县| 子长县| 鱼台县| 巨野县| 宽甸| 无为县| 平果县| 龙门县| 望谟县| 尼木县| 工布江达县| 藁城市| 奉贤区| 行唐县| 陇西县| 峨边| 遂溪县| 自治县| 安乡县| 扎兰屯市| 阿坝| 永顺县| 房产| 莱芜市| 昂仁县| 抚松县| 株洲市| 屏东县| 奉新县| 石棉县| 乌兰县| 山东省| 电白县| 辰溪县| 兖州市| 商河县| 富阳市| 新密市|