文件中有一個位置指針,指向當前讀寫的位置。如果順序讀寫一個文件,每次讀寫一個字符,則讀寫完一個字符後,該位置指針自動移動指向下一個字符位置。如果想改變這樣的規律,即強制使位置指針指向其他指定的位置,這可以用有關函數來實現。
1.rewind函數
rewind函數的作用是使位置指針重新返回文件的開頭。此函數沒有返回值,執行rewind函數
rewind (fp );
使文件的位置指針重新定位於文件開頭,並使feof函數的值恢復為0(假)。
2.fseek函數和隨機讀寫
對流式文件可以進行順序讀寫,也可以進行隨機讀寫。用fseek函數可以實現改變文件的位置指針。函數的調用形式為
fseek (文件類型指針,位移量,起始點)
「起始點」用0,1或2代替,0代表「文件開始」,1代表「當前位置」,2代表「文件末尾」。也可以使用符號定義,即SEEK_SET代表「文件開始」,SEEK_CUR代表「當前位置」,SEEK_END代表「文件末尾」。下面是幾個例子:
fseek (fp ,100L ,0 ); // 把文件內部指針移動到離文件開頭100 字節處; fseek (fp ,100L ,1 ); // 把文件內部指針移動到離文件當前位置100 字節處; fseek (fp ,-100L ,2 ); // 把文件內部指針退回到離文件結尾100 字節處。
3.ftell函數
ftell函數的作用是得到流式文件中的當前位置,並將它用相對於文件開頭的位移量表示出來。假設n為整型變量,則
n=ftell (fp );
將獲取的fp指定文件的當前讀寫位置傳給變量n,n是當前讀寫位置偏離文件頭部的字節數。
用fseek函數把位置指針移到文件尾,再用ftell函數獲得這時位置指針距文件頭的字節偏移數,這個字節數+1就是文件的長度。
【例22.22】演示3個文件定位函數的程序。
#include <stdio.h> int main () { char str[128]="How are you ? Fine ! thank you." ; char st[128]={'\0'} ; int length=0 ; FILE *fp ; fp=fopen ("t.txt" ,"w+" ); fputs (str , fp ); // 把文件的位置指針移到離文件頭4 字節處 fseek (fp ,4L ,SEEK_SET ); fgets (st ,4 ,fp ); // 取are printf ("%s\n" , st ); // 把文件的位置指針移到離當前文件指針6 字節處 fseek (fp ,6L ,SEEK_CUR ); fgets (st ,7 ,fp ); // 取Fine ! printf ("%s\n" , st ); if (fp==NULL ) printf ("file not found !\n" ); else { // 把文件的位置指針移到文件尾 fseek (fp ,0L ,SEEK_END ); // 獲取文件長度; length=ftell (fp )+1 ; printf (" 該文件的長度為%d 字節\n" ,length ); } // 把文件的位置指針移到離文件尾16 字節處 fseek (fp ,-16L ,SEEK_END ); fgets (st ,17 ,fp ); // 取Fine ! thank you. printf ("%s\n" , st ); rewind (fp ); // 回起始點 fgets (st ,30 ,fp ); // 取整個字串 printf ("%s\n" , st ); fclose (fp ); return 0 ; }
對照程序,很容易理解這3個函數的使用方法。程序運行結果如下:
are Fine ! 該文件的長度為30 字節 Fine ! thank you. How are you ? Fine ! thank you.