void rewind(FILE *fp); // 移至文件開頭
int fseek(FILE *fp, long int offset, int origin);
origin 三種取值:
SEEK_SET (0):文件開頭SEEK_CUR (1):當前位置SEEK_END (2):文件結尾注意:以追加模式("a"/"a+")打開時,寫操作前fseek/rewind無效,數據始終追加到末尾。
| 函數 | 原型 | 功能 | 返回值 |
|---|---|---|---|
| ftell | long int ftell(FILE *fp) | 當前位置距文件開頭字節數 | 出錯返回 -1L |
| feof | int feof(FILE *fp) | 檢測是否到達文件末尾 | 到達非0,否則0 |
| ferror | int ferror(FILE *fp) | 檢測操作是否出錯 | 出錯非0,否則0 |
| remove | int remove(const char *filename) | 刪除文件 | 成功0,失敗非0 |
| rename | int rename(const char *old, const char *new) | 重命名文件 | 成功0,失敗非0 |
| freopen | FILE* freopen(const char *filename, const char *mode, FILE *stream) | 重定向標準輸入/輸出 | 成功返回流,失敗NULL |
| fclose | int fclose(FILE *stream) | 關閉流 | 成功0,失敗-1 |
#include <stdio.h>
#include <stdlib.h>
int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w+", stdout);
int i, a[10];
for (i = 0; i < 10; ++i) scanf("%d", &a[i]);
for (i = 0; i < 10; ++i) printf("%d\n", a[i]);
return 0;
}
input.txt 內容:1 2 -1 3 4 5 7 8 9 10
程式直接從文件讀取,結果寫入 output.txt,控制台無輸出。
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
rewind(fp); // 或 fseek(fp, 0, SEEK_SET)
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("test.dat", "wb+");
if (!fp) return 1;
// 寫入測試數據
for (int i = 0; i < 10; ++i) fputc(i + 65, fp);
// 演示 ftell/fseek
printf("初始位置: %ld\n", ftell(fp)); // 10
fseek(fp, 3, SEEK_SET);
printf("移動後: %ld, 讀取: %c\n", ftell(fp), fgetc(fp)); // 3, 'D'
fseek(fp, -2, SEEK_CUR);
printf("相對移動: %ld\n", ftell(fp)); // 2
fseek(fp, 0, SEEK_END);
printf("文件大小: %ld\n", ftell(fp)); // 10
fclose(fp);
return 0;
}
fclose,否則緩衝區數據可能丟失"rb"/"wb")下 fseek offset 必須是 ftell 返回值或 0fseek 僅支援 SEEK_SET 配合 ftell 返回值