日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C语言中文件定位函数总结

發(fā)布時(shí)間:2023/12/2 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中文件定位函数总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C語(yǔ)言中文件定位函數(shù)主要是:fseek, ftell, fsetpos, fgetpos。

先來(lái)講前兩個(gè)函數(shù),這是最基本的定位函數(shù):


?

  fseek函數(shù):能把文件指針移動(dòng)到文件任何位置,其原型是:int fseek(FILE *fp, long offset, int fromwhere);

  參數(shù)解釋:第一個(gè)參數(shù)為要進(jìn)行定位的文件的指針;第二個(gè)參數(shù)為定位的偏移量,一個(gè)有符號(hào)的long類型值,正數(shù)表示文件指針向后偏移,負(fù)數(shù)表示文件指針向前偏移,0 表示不進(jìn)行偏移;第三個(gè)參數(shù)表示文件指針從哪個(gè)位置開(kāi)始偏移,有三個(gè)值可選,SEEK_SET & SEEK_CUR & SEEK_END,分別表示文件第一個(gè)字節(jié)(即第零個(gè)位置),文件指針當(dāng)前所指字節(jié)(即當(dāng)前位置)和文件EOF位置。

  返回值:返回 0 表示操作成功,返回非 0 表示操作失敗。

  其他注意:該函數(shù)不能定位到第一個(gè)字節(jié)之前的位置,如果嘗試這樣操作會(huì)導(dǎo)致fseek返回 -1,即操作失敗,比如這樣的代碼“j = fseek(fp, -4L, SEEK_SET );”,其中 j 值就是 -1;但是,該函數(shù)能定位到EOF位置之后的位置,并且不報(bào)錯(cuò),即使這樣是沒(méi)有意義的,比如這樣的代碼“j = fseek(fp, 4L, SEEK_END)”,返回值 j 是 0,并且此時(shí) ftell(fp) 返回值是SEEK_END + 4。


?

  ftell函數(shù):能返回當(dāng)前文件指針?biāo)诘奈恢?#xff08;文件的第一個(gè)字節(jié)所在位置是零),其原型是:long ftell(FILE *fp);

  參數(shù)解釋:有且僅有一個(gè)參數(shù),為一個(gè)文件的指針。

  返回值:有符號(hào)long類型的正向值,即0~2147483647。

  其他注意:暫無(wú)。


?

實(shí)際上,前兩個(gè)函數(shù)對(duì)文件指針的定位雖然都很方便,但是它們都有一個(gè)局限性,那就是它們能定位的最大字節(jié)是依據(jù) long 類型的取值范圍決定。比如 fseek(fp, max_pos, SEEK_SET);,它能移動(dòng)的最大偏移量是 max_pos = 2147483647字節(jié),即1GB,對(duì)于大于1GB的文件來(lái)說(shuō)就力不從心了。

所以ANSI C推出了解決大文件定位的方案,即后兩個(gè)函數(shù)!(不過(guò),即使是現(xiàn)在,直接處理一個(gè)超過(guò)1G的單文件還是比較少的)

在說(shuō)這兩個(gè)函數(shù)之前,先要介紹一個(gè)數(shù)據(jù)類型fpos_t,它是一個(gè)結(jié)構(gòu)體類型,保存著文件指針的位置,并且這種數(shù)據(jù)類型只能被fgetpos和fsetpos函數(shù)使用。


  fsetpos函數(shù):將文件指針的位置設(shè)置為fpos_t類型變量所保存的位置,其原型是:int fsetpos(FILE *, const fpos_t *)

  參數(shù)解釋:第一個(gè)參數(shù)為一個(gè)文件的指針;第二個(gè)參數(shù)為一個(gè)fpos_t類型的指針。

  返回值:0 表示操作成功,非 0 表示操作失敗。

  其他注意:暫無(wú)。


  fgetpos函數(shù):將文件指針的位置保存到fpos_t類型變量中,其原型是:int fgetpos(FILE *, fpos_t *)

  參數(shù)解釋:同fsetpos。

  返回值:同fsetpos。

  其他注意:暫無(wú)。


總結(jié):后兩個(gè)函數(shù)通常是fseek函數(shù)偏移累加之后超過(guò)long范圍時(shí)才用到,例如如下代碼:

fpos_t pos; //定義一個(gè)fpos_t類型的變量pos f = fopen("a.txt", "r"); //假設(shè)a.txt是一個(gè)超過(guò)1G的文件 fseek(f, 2000000000L, SEEK_SET); //向后偏移20億字節(jié) fseek(f, 1000000000L, SEEK_CUR); //再向后面偏移10億字節(jié) //此時(shí),文件指針的位置已經(jīng)超過(guò)了signed long的正向范圍,就需要用fpos_t類型變量來(lái)保存文件指針位置了 fgetpos(f, &pos); //此時(shí),當(dāng)前文件指針的位置已保存到pos變量中了 fseek(f, 5000L, SEEK_CUR); printf("%x\n", getc(f)); //再向后偏移5千字節(jié),并取出偏移后所在的字節(jié),以十六進(jìn)制打印出來(lái) fsetpos(f, &pos); //利用fsetpos函數(shù)重置文件指針,根據(jù)最后一次fgetpos保存的pos值,這次函數(shù)操作將向前偏移5千字節(jié) printf("%x\n", getc(f)); //以十六進(jìn)制打印出當(dāng)前字節(jié) fclose(f); //釋放文件流

?上述代碼可能有點(diǎn)抽象,因?yàn)槟憧赡芤粫r(shí)間找不到大于1G的文件,那么我們就用小文件來(lái)演示一下:

假設(shè)文件"utf8.txt"的十六進(jìn)制結(jié)構(gòu)如下:

41 42 43 56 57 44 44 4B

C語(yǔ)言代碼如下:

FILE * f1; fpos_t pos; f1 = fopen("utf8.txt", "r"); fseek(f1,2,SEEK_SET); fgetpos(f1, &pos); fseek(f1,4,SEEK_SET); printf("%x\n", getc(f1)); fsetpos(f1,&pos); printf("%x\n", getc(f1)); fclose(f1);

輸出結(jié)果:

57
43
Press any key to continue

轉(zhuǎn)載于:https://www.cnblogs.com/ryzz/p/9357158.html

總結(jié)

以上是生活随笔為你收集整理的C语言中文件定位函数总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。