void rewind(FILE *fp);
從上面的函數原型可以看出,rewind 並沒有返回值,因此也無法做安全性檢查。如下面的範例程式碼所示:FILE *fp=NULL; fp=fopen("Test.txt","r"); if(fp==NULL) { } rewind(fp);在上面的範例程式碼中,由於 rewind 函數沒有返回值,所以我們很難判斷“rewind(fp)”是否執行成功。因此,應該盡量使用 fseek 來替換 rewind 函數,從而以驗證流已經成功地回繞。如下面的範例程式碼所示:
if (fseek(fp, 0L, SEEK_SET) != 0) { }相對於 rewind 函數而言,fseek 函數的功能更加強大,它用來設定檔案的當前讀寫位置,從而可以實現以任意順序存取檔案的不同位置,以實現檔案的隨機存取。其函數的一般原型如下所示:
int fseek(FILE *fp,long offset,int from);
如果該函數執行成功,fp 將指向以 from 為基準,偏移 offset 個位元組的位置,函數的返回值為 0;如果該函數執行失敗(比如 offset 超過檔案自身大小),則不改變 fp 指向的位置,函數的返回值為 -1,並設定 errno 的值,可以用 perror 函數來輸出錯誤資訊。起始點 | 表不符號 | 數位表示 |
---|---|---|
檔案首 | SEEK_SET | 0 |
當前位置 | SEEK_CUR | 1 |
檔案末尾 | SEEK_END | 2 |
/*將讀寫位置移動到離檔案開頭100位元組處*/ fseek(fp,100L,0); /*將讀寫位置移動到離檔案當前位置100位元組處*/ fseek(fp,100L,1); /*將讀寫位置退回到離檔案結尾100位元組處*/ fseek(fp,-100L,2); /*將讀寫位置移動到檔案的起始位置*/ fseek(fp,0L,SEEK_SET); /*將讀寫位置移動到檔案尾*/ fseek(fp,0L,SEEK_END);不難發現,上面的語句“(void)fseek(fp,0L,SEEK_SET);”的作用實際上等同於 rewind 函數。與此同時,在使用 fseek 函數時,還應該注意如下 3 點。
long ftell(FILE *fp);
該函數用於得到檔案位置指標當前位置相對於檔案首的偏移位元組數。在隨機方式存取檔案時,由於檔案位置頻繁前後移動,程式不容易確定檔案的當前位置。在使用 fseek 函數後,再呼叫函數 ftell 就能非常容易地確定檔案的當前位置。如下面的範例程式碼所示:long getfilelength(FILE *fp) { long curpos=0L; long length=0L; curpos = ftell(fp); fseek(fp, 0L, SEEK_END); length = ftell(fp); fseek(fp, curpos, SEEK_SET); return length; }