如何使用檔案的fseek函式對檔案指標進行操作
阿新 • • 發佈:2019-01-07
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);
【例項】建立一個檔案,寫入資料後讀取並顯示出來。
- #include<iostream.h>
- #include<stdio.h>
- void main(void)
- {
- FILE* stream;
- long l;
- float fp;
- char s[81];
- char c;
- stream = fopen("fscanf.txt","w+");
- if(stream == NULL) // 開啟檔案失敗
- {
- printf("the file is opeaned error!\n");
- }
- else // 輸出資訊
- {
- fprintf(stream,"%s %ld %f %c","a_string",6500,3.1415,'x'); // 格式化
- fseek(stream,0L,SEEK_SET); // 檔案定位
- fscanf(stream,"%s",s);
- fscanf(stream,"%ld",&l);
- fscanf(stream,"%f",&fp);
- fscanf(stream," %c",&c);
- printf("%s\n",s);
- printf("%ld\n",l);
- printf("%f\n",fp);
- printf("%c\n",c);
- fclose(stream); // 關閉
- }
- }
a_string
6500
3.141500
x
程式首先建立一個檔案,使用 fprintf() 函式往檔案流中寫入一些資料,然後使用 fseek() 函式把檔案的當前讀/寫指標定位到 檔案頭,再使用 fscanf() 函式按格式逐個讀取寫入的資料並顯示。