C语言中文件定位函数总结
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)題。
- 上一篇: ddos攻击防护思路?
- 下一篇: BIOS维修技术