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

C語言文件隨機讀寫:fseek、rewind 定位與實戰示例

     編輯:C 語言基礎

什麼是文件隨機讀寫?

順序讀寫只能從文件開頭依次處理數據,而隨機讀寫允許將文件內部位置指針移動到任意位置,實現「跳轉式」讀寫,靈活高效。

核心函數:rewind 與 fseek

rewind() - 重置到文件開頭

void rewind(FILE *fp);

將位置指針移回文件開頭,等價於 fseek(fp, 0, SEEK_SET),但會清除錯誤標誌和 EOF 標誌。

fseek() - 移動到任意位置

int fseek(FILE *fp, long offset, int origin);
參數說明
fp文件指針
offset偏移量(字節數),long 類型支持大文件
origin起始基準點(見下表)

origin 取值對照表

起始點常量名常量值
文件開頭SEEK_SET0
當前位置SEEK_CUR1
文件末尾SEEK_END2

常用示例

  • 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)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved