fseek

fseek

int fseek(FILE *stream, long offset, int fromwhere);函式設定檔案指針stream的位置。

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

fseek函式和lseek函式類似,但lseek返回的是一個off_t數值,而fseek返回的是一個整型。

基本介紹

  • 外文名: fseek
  • 類型:函式
  • 領域:計算機
  • 注意:不是定位檔案指針
功 能,頭檔案,用 法,描 述,返回值,程式例,注意事項,

功 能

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

頭檔案

#include <stdio.h>

用 法

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.

程式例

#include <stdio.h>long filesize(FILE*stream);int main(void){FILE *stream;stream=fopen("MYFILE.TXT","w+b");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位元組處。
使用實例:
#include<stdio.h>#define N 5typedef struct student{  long sno;  char name[10];  float score[3];}STU; void fun(char*filename,STU n){  FILE*fp;  fp=fopen(filename,"rb+");  fseek(fp,-1L*sizeof(STU),SEEK_END);  fwrite(&n,sizeof(STU),1,fp);  fclose(fp);} int main()/*修改覆蓋最後一個學生數據*/{  STU t[N]={    {10001,"MaChao",91,92,77},    {10002,"CaoKai",75,60,88},    {10003,"LiSi",85,70,78},    {10004,"FangFang",90,82,87},    {10005,"ZhangSan",95,80,88}  };    STU n={10006,"ZhaoSi",55,70,68},ss[N];  int i,j;FILE*fp;    fp=fopen("student.dat","wb");    fwrite(t,sizeof(STU),N,fp);    fclose(fp);    fp=fopen("student.dat","rb");    fread(ss,sizeof(STU),N,fp);    fclose(fp);    printf("\nThe original data:\n\n");    for(j=0;j<N;j++)  {    printf("\nNo:%ldName:%-8sScores:",ss[j].sno,ss[j].name);    for(i=0;i<3;i++)        printf("%6.2f",ss[j].score[i]);    printf("\n");  }  fun("student.dat",n);  printf("\nThe data after modifing:\n\n");  fp=fopen("student.dat","rb");  fread(ss,sizeof(STU),N,fp);  fclose(fp);  for(j=0;j<N;j++)  {    printf("\nNo:%ldName:%-8sScores:",ss[j].sno,ss[j].name);    for(i=0;i<3;i++)        printf("%6.2f",ss[j].score[i]);    printf("\n");  }  return 0;}

注意事項

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

相關詞條

熱門詞條

聯絡我們