1. 程式人生 > >如何使用檔案的fseek函式對檔案指標進行操作

如何使用檔案的fseek函式對檔案指標進行操作

C語言fseek()函式:移動檔案的讀寫指標到指定的位置

<上一節下一節> 標頭檔案:#include <stdio.h>

fseek()函式可以移動檔案的讀寫指標到指定的位置,即移動當前檔案的位置指標,其原型為:
    int fseek(FILE * stream, long offset, int fromwhere);

【引數】stream為檔案指標,offset為偏移量,fromwhere為指標的起始位置。

引數 offset 為根據引數 fromwhere 來移動讀寫位置的位移數。引數 fromwhere 為下列其中一種:
  • SEEK_SET:從距檔案開頭 offset 位移量為新的讀寫位置;
  • SEEK_CUR:以目前的讀寫位置往後增加 offset 個位移量;
  • SEEK_END:將讀寫位置指向檔案尾後再增加 offset 個位移量。

當 fromwhere 為 SEEK_CUR 或 SEEK_END 時,引數 offset 允許負值的出現。

對於以二進位制方式開啟的檔案流,移動後的位置為 fromwhere + offset。

對於以文字方式開啟的檔案流,offset 必須為 0 或 ftell() 函式的返回值,而且 fromwhere 必須為 SEEK_SET。

fseek() 函式一般用於二進位制檔案,也可以用於文字檔案。用於文字檔案操作時,需特別注意回車換行的情況:因為在一般瀏覽工具如UltraEdit中,回車換行視為兩個字元0x0D和0x0A,但真實的檔案讀寫和定位時卻按照一個字元0x0A進行處理,因此碰到此類問題時,可以考慮將檔案整個讀入記憶體,然後在記憶體中手工插入0x0D的方法,這樣可以達到較好的處理效果。

如果引數為其它值,那麼結果將根據特定平臺和庫實現而定。

【返回值】成功返回 0,否則返回非 0 值。如果發生讀寫錯誤,將會設定設定檔案錯誤標識。

注意:經筆者測試,超出檔案末尾位置,還是返回 0。往回偏移超出首位置,返回-1,且指向一個 -1 的位置,請小心使用。


如果函式執行成功,將會設定檔案結束標誌,並將消除函式 ungetc() 的所有影響。

fseek()函式和lseek()函式類似,但lseek()返回的是一個 off_t 數值,而fseek()返回的是一個整型。而且 fseek() 不像 lseek() 會返回當前讀寫位置,必須使用ftell()來取得目前讀寫的位置。

如果以追加的方式(a+)開啟檔案,那麼fseek()允許在讀和寫之間切換。

舉兩個例子:
  • 將讀寫位置移動到檔案開頭:fseek(fp, 0, SEEK_SET);
  • 將讀寫位置移動到檔案尾時:fseek(fp, 0, SEEK_END);
  • 將讀寫位置動到離檔案開頭100位元組處:fseek(fp,100L, SEEK_SET);
  • 將讀寫指標移動到離檔案當前位置100位元組處:fseek(fp,100L, SEEK_CUR);
  • 將讀寫指標退回到離檔案結尾100位元組處:fseek(fp, -100L, SEEK_END);

【例項】建立一個檔案,寫入資料後讀取並顯示出來。
  1. #include<iostream.h>
  2. #include<stdio.h>
  3. void main(void)
  4. {
  5. FILE* stream;
  6. long l;
  7. float fp;
  8. char s[81];
  9. char c;
  10. stream = fopen("fscanf.txt","w+");
  11. if(stream == NULL) // 開啟檔案失敗
  12. {
  13. printf("the file is opeaned error!\n");
  14. }
  15. else // 輸出資訊
  16. {
  17. fprintf(stream,"%s %ld %f %c","a_string",6500,3.1415,'x'); // 格式化
  18. fseek(stream,0L,SEEK_SET); // 檔案定位
  19. fscanf(stream,"%s",s);
  20. fscanf(stream,"%ld",&l);
  21. fscanf(stream,"%f",&fp);
  22. fscanf(stream," %c",&c);
  23. printf("%s\n",s);
  24. printf("%ld\n",l);
  25. printf("%f\n",fp);
  26. printf("%c\n",c);
  27. fclose(stream); // 關閉
  28. }
  29. }
輸出結果:
a_string
6500
3.141500
x

程式首先建立一個檔案,使用 fprintf() 函式往檔案流中寫入一些資料,然後使用 fseek() 函式把檔案的當前讀/寫指標定位到 檔案頭,再使用 fscanf() 函式按格式逐個讀取寫入的資料並顯示。