#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 狀態 (關鍵差異)
}
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);
以 "r+" 開啟文件,寫入後需 rewind 或 fseek 回開頭才能正確讀取剛寫入的數據,否則讀到 EOF。
while (!feof(fp)) {
if (fread(&item, sizeof(item), 1, fp) != 1) {
if (ferror(fp)) {
perror("讀取錯誤");
clearerr(fp); // 或 rewind(fp) 同時歸零
// 可選:跳過壞塊、重試、記錄日誌
}
break;
}
process(item);
}
| 特性 | rewind(stream) | fseek(stream, 0, SEEK_SET) |
|---|---|---|
| 功能 | 歸零 + 清除錯誤/EOF 標誌 | 僅移動指針 (可移至任意位置) |
| 回傳值 | void (無錯誤回報) | int (成功 0,失敗 -1) |
| 適用場景 | 簡單歸零、錯誤恢復 | 隨機存取、需檢查錯誤 |
ftruncate (POSIX) 或重新以 "w" 開啟。"rb+" 同樣適用。rewind(stdin) 行為未定義 (標準輸入通常不可定位),勿用。rewind 是「歸零並重置狀態」的便捷函數。掌握 文件位置指標、EOF/錯誤標誌 的概念,配合 fseek, ftell, clearerr,才能精準控制文件流操作。