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

C 語言文件操作進階:定位、屬性查詢與重定向完全指南

     編輯:關於C語言

文件位置指針控制

rewind - 回到起點

void rewind(FILE *fp); // 等價於 fseek(fp, 0, SEEK_SET) 並清除錯誤/EOF 標誌

fseek - 隨機定位

int fseek(FILE *fp, long offset, int origin);
// origin: SEEK_SET(0) 文件首 | SEEK_CUR(1) 當前位置 | SEEK_END(2) 文件尾
// 返回 0 成功,非 0 失敗
// 典型用法
fseek(fp, 0, SEEK_END);      // 移至文件尾
long size = ftell(fp);       // 獲取文件大小
fseek(fp, 100, SEEK_SET);    // 移至第 100 字節
fseek(fp, -50, SEEK_CUR);    // 向前 50 字節

注意:以追加模式("a"/"a+")打開時,寫入前系統強制移至文件尾,fseek/rewind 對寫入無效。

常用屬性查詢函數

ftell - 獲取當前偏移

long ftell(FILE *fp); // 返回距文件首字節數,錯誤返回 -1L

feof - 檢測文件結束

int feof(FILE *fp); // 已到達 EOF 返回非 0,否則 0
// 關鍵:只有「嘗試讀取並失敗」後才置位 EOF 標誌

ferror - 檢測錯誤

int ferror(FILE *fp); // 發生錯誤返回非 0,否則 0

文件管理操作

remove - 刪除文件

int remove(const char *filename); // 成功 0,失敗非 0

rename - 重命名/移動

int rename(const char *oldname, const char *newname); // 成功 0,失敗非 0

freopen - 重定向標準流

FILE* freopen(const char *filename, const char *mode, FILE *stream);
// 典型:競程/測試時重定向 stdin/stdout
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
// 之後 scanf/printf 直接操作文件

fclose - 關閉流

int fclose(FILE *stream); // 成功 0,失敗 -1(EOF)
// 必須調用:刷新緩衝區、釋放資源、更新文件元數據

完整測試程式:標準流重定向

#include 
#include 

int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w+", stdout);

    int a[10];
    for (int i = 0; i < 10; i++) scanf("%d", &a[i]);
    for (int 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,控制台無輸出

最佳實踐清單

  1. 打開文件必檢查返回值 NULL。
  2. 二進制模式("rb"/"wb")避免換行符轉換差異。
  3. 隨機讀寫用 fseek+ftell,順序流用 feof+ferror 判斷結束。
  4. 關鍵數據寫入後 fflush 或 fclose 確保落盤。
  5. 大文件(>2GB)需 64 位版本 _fseeki64/_ftelli64。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved