C語言rewind()函式:將檔案指標重新指向檔案開頭

2puT發表於2016-07-16
標頭檔案:#include <stdio.h>

rewind()函式用於將檔案指標重新指向檔案的開頭,同時清除和檔案流相關的錯誤和eof標記,相當於呼叫fseek(stream, 0, SEEK_SET),其原型如下:
    void rewind(FILE * stream);

【引數】stream為以開啟檔案的指標。

注意:準確的說,這裡的指標不是檔案指標stream,而是檔案內部的位置指標,隨著對檔案的讀寫檔案的位置指標(指向當前讀寫位元組)向後移動。而檔案指標是指向整個檔案,如果不重新賦值檔案指標不會改變。

檔案指標FILE *stream中,包含一個讀寫位置指標char *_nextc,它指向下一次檔案讀寫的位置。其結構如下:
  1. typedef struct
  2. {
  3. int _fd; // 檔案號
  4. int _cleft; // 緩衝區中剩下的位元組數
  5. int _mode; // 檔案操作模式
  6. char * _nextc; // 下一個位元組的位置
  7. char * _buff; // 檔案緩衝區位置
  8. }FILE;
每當進行一次讀寫後,該指標自動指向下一次讀寫的位置。當檔案剛開啟或建立時,該指標指向檔案的開始位置。可以用函式ftell()獲得當前的位置指標,也可以用rewind()/fseek()函式改變位置指標,使其指向需要讀寫的位置。

【例項】讀取檔案的資料後再回到開頭重新讀取。
  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. printf("%ld\n",ftell(stream));
  21. fscanf(stream,"%ld",&l);
  22. printf("%ld\n",ftell(stream));
  23. fscanf(stream,"%f",&fp);
  24. printf("%ld\n",ftell(stream));
  25. fscanf(stream," %c",&c);
  26. printf("%ld\n",ftell(stream));
  27. rewind(stream);/*指向檔案開頭*/
  28. fscanf(stream,"%s",s);
  29. printf("%s\n",s);
  30. fclose(stream);/*關閉流*/
  31. }
  32. }
執行結果:
8
13
22
24
a_string

程式先建立一個檔案寫入一些資料,然後使用feeek函式定位檔案指標到檔案開頭逐個讀取資料,讀取完畢後使用rewind函式將檔案的讀/寫指標重新定位到檔案的開頭,再次讀取時發現讀取的是開頭的字元a_string。

又如,把一個檔案的內容顯示在螢幕上,並同時複製到另一個檔案。
  1. #include "stdio.h"
  2. void main()
  3. {
  4. FILE *fp1, *fp2;
  5. fp1 = fopen("file1.c", "r"); // 原始檔
  6. fp2 = fopen("file2.c", "w"); // 複製到file2.c
  7. while(!feof(fp1)) putchar(fgetc(fp1)); // 顯示到螢幕上
  8. rewind(fp1); // fp回到開始位置
  9. while(!feof(fp1)) fputc(fgetc(fp1), fp2);
  10. fclose(fp1);
  11. fclose(fp2);
  12. }

相關文章