首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C 語言 rewind 函數詳解:文件指針歸零與錯誤恢復

     編輯:C 語言問答

函數原型與標頭檔


#include <stdio.h>

void rewind(FILE *stream);

核心功能

將文件流 stream 的位置指標 (Position Indicator) 移動到文件開頭 (位元組偏移量 0)。

等價於:fseek(stream, 0L, SEEK_SET);,但 rewind 額外清除錯誤標誌與 EOF 標誌。

內部實現邏輯 (概念)


void rewind(FILE *stream) {
    fseek(stream, 0L, SEEK_SET); // 移動指針
    clearerr(stream);            // 重置錯誤/EOF 狀態 (關鍵差異)
}

為何需要 rewind?典型應用場景

1. 重複讀取文件內容


FILE *fp = fopen("data.txt", "r");
// 第一次遍歷:統計行數
int lines = 0; char buf[256];
while (fgets(buf, sizeof(buf), fp)) lines++;
printf("總行數: %d\n", lines);

// 歸零指針,準備第二次遍歷
rewind(fp);

// 第二次遍歷:處理每行
while (fgets(buf, sizeof(buf), fp)) {
    process_line(buf);
}
fclose(fp);

2. 讀寫模式切換點

以 "r+" 開啟文件,寫入後需 rewind 或 fseek 回開頭才能正確讀取剛寫入的數據,否則讀到 EOF。

3. 錯誤恢復後重試


while (!feof(fp)) {
    if (fread(&item, sizeof(item), 1, fp) != 1) {
        if (ferror(fp)) {
            perror("讀取錯誤");
            clearerr(fp); // 或 rewind(fp) 同時歸零
            // 可選:跳過壞塊、重試、記錄日誌
        }
        break;
    }
    process(item);
}

rewind vs fseek 對比

特性rewind(stream)fseek(stream, 0, SEEK_SET)
功能歸零 + 清除錯誤/EOF 標誌僅移動指針 (可移至任意位置)
回傳值void (無錯誤回報)int (成功 0,失敗 -1)
適用場景簡單歸零、錯誤恢復隨機存取、需檢查錯誤

常見誤區

  1. 以為 rewind 能縮減文件大小:不能。若需截斷文件,需 ftruncate (POSIX) 或重新以 "w" 開啟。
  2. 二進制模式下使用:完全支援,"rb+" 同樣適用。
  3. 標準輸入 stdin:rewind(stdin) 行為未定義 (標準輸入通常不可定位),勿用。

總結

rewind 是「歸零並重置狀態」的便捷函數。掌握 文件位置指標、EOF/錯誤標誌 的概念,配合 fseek, ftell, clearerr,才能精準控制文件流操作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved