順序讀寫只能從文件開頭依次處理數據,而隨機讀寫允許將文件內部位置指針移動到任意位置,實現「跳轉式」讀寫,靈活高效。
void rewind(FILE *fp);
將位置指針移回文件開頭,等價於 fseek(fp, 0, SEEK_SET),但會清除錯誤標誌和 EOF 標誌。
int fseek(FILE *fp, long offset, int origin);
| 參數 | 說明 |
|---|---|
| fp | 文件指針 |
| offset | 偏移量(字節數),long 類型支持大文件 |
| origin | 起始基準點(見下表) |
| 起始點 | 常量名 | 常量值 |
|---|---|---|
| 文件開頭 | SEEK_SET | 0 |
| 當前位置 | SEEK_CUR | 1 |
| 文件末尾 | SEEK_END | 2 |
fseek(fp, 100, SEEK_SET):移至離文件開頭 100 字節處fseek(fp, -50, SEEK_CUR):從當前位置向前移 50 字節fseek(fp, 0, SEEK_END):移至文件末尾(常用於獲取文件大小)注意:fseek 主要用於二進制文件("rb+"、"wb+")。文本文件因換行符轉換(Windows \r\n ↔ \n),位置計算可能不準確。
#include <stdio.h>
#define N 3
struct Student {
char name[10];
int num;
int age;
float score;
};
int main() {
struct Student boys[N], boy;
FILE *fp;
int i;
// 以二進制讀寫方式打開/創建文件
if ((fp = fopen("d:\\demo.txt", "wb+")) == NULL) {
printf("Cannot open file!\n");
return 1;
}
printf("請輸入 3 位學生信息(姓名 學號 年齡 成績):\n");
for (i = 0; i < N; i++) {
scanf("%s %d %d %f", boys[i].name, &boys[i].num, &boys[i].age, &boys[i].score);
}
// 寫入 3 條記錄
fwrite(boys, sizeof(struct Student), N, fp);
// 移動到第 2 條記錄開頭(偏移 1 個結構體大小)
fseek(fp, sizeof(struct Student), SEEK_SET);
// 讀取第 2 條記錄
fread(&boy, sizeof(struct Student), 1, fp);
printf("第 2 位學生:%s %d %d %.2f\n", boy.name, boy.num, boy.age, boy.score);
fclose(fp);
return 0;
}
請輸入 3 位學生信息: Tom 2 15 90.5 Hua 1 14 99 Zhao 10 16 95.5 第 2 位學生:Hua 1 14 99.00
fseek 返回 0 表示成功,非 0 表示失敗ftell(fp) 可獲取當前位置指針偏移量offset 用 long 或 long long(配合 fseeko/ftello)