fseek

fseek

int fseek(FILE *stream, long offset, int fromwhere);函數設置文件指針stream的位置。

如果執行成功,stream將指向以fromwhere為基準,偏移offset(指針偏移量)個位元組的位置,函數返回0。如果執行失敗(比如offset取值大於等於2*1024*1024*1024,即long的正數範圍2G),則不改變stream指向的位置,函數返回一個非0值。

功 能


重定位流(數據流/文件)上的文件內部位置指針
注意:文件指針指向文件/流。位置指針指向文件內部的位元組位置,隨著文件的讀取會移動,文件指針如果不重新賦值將不會改變或指向別的文件。

頭文件


#include

用 法


int fseek(FILE *stream, long offset, int fromwhere);

描 述


函數設置文件指針stream的位置。如果執行成功,stream將指向以fromwhere(偏移起始位置:文件頭0(SEEK_SET),當前位置1(SEEK_CUR),文件尾2(SEEK_END))為基準,偏移offset(指針偏移量)個位元組的位置。如果執行失敗(比如offset超過文件自身大小),則不改變stream指向的位置。
fseek函數和lseek函數類似,但lseek返回的是一個off_t數值,而fseek返回的是一個整型。

返回值


成功,返回0,失敗返回-1,並設置error的值,可以用perror()函數輸出錯誤。
fseek position the file(文件) position(位置) pointer(指針) for the file referenced by stream to the byte location calculated by offset.

程序例


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include 
long filesize(FILE*stream);
int main(void)
{
FILE *stream;
stream=fopen("MYFILE.TXT","wb+");
fprintf(stream,"Thisisatest");
printf("FilesizeofMYFILE.TXTis%ldbytes\n",filesize(stream));
fclose(stream);
return 0;
}
 
long filesize(FILE*stream)
{
long curpos,length;
curpos=ftell(stream);
fseek(stream,0L,SEEK_END);
length=ftell(stream);
fseek(stream,curpos,SEEK_SET);
return length;
}
int fseek( FILE *stream, long offset, int origin );
第一個參數stream為文件指針
第二個參數offset為偏移量,正數表示正向偏移,負數表示負向偏移
第三個參數origin設定從文件的哪裡開始偏移,可能取值為:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET:文件開頭
SEEK_CUR:當前位置
SEEK_END:文件結尾
其中SEEK_SET,SEEK_CUR和SEEK_END依次為0,1和2.
簡言之:
fseek(fp,100L,0);把stream指針移動到離文件開頭100位元組處;
fseek(fp,100L,1);把stream指針移動到離文件當前位置100位元組處;
fseek(fp,-100L,2);把stream指針退回到離文件結尾100位元組處。
使用實例:

注意事項


fseek函數的文件指針,應該為已經打開的文件。如果沒有打開的文件,那麼將會出現錯誤。 fseek函數也可以這樣理解,相當於在文件當中定位。這樣在讀取規律性存儲文件時可以利用其OFFSET偏移量讀取文件上任意的內容。
fseek函數一般用於二進位文件,也可以用於文本文件。用於文本文件操作時,需特別注意回車換行的情況:因為在一般瀏覽工具如UltraEdit中,回車換行視為兩個字元0x0D和0x0A,但真實的文件讀寫和定位時卻按照一個字元0x0A進行處理,因此碰到此類問題時,可以考慮將文件整個讀入內存,然後在內存中手工插入0x0D的方法,這樣可以達到較好的處理效果。