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

C 語言文件操作深度解析(四):位置指針控制與常用函數全覽

     編輯:關於C

位置指針移動函數

rewind

void rewind(FILE *fp);  // 移至文件開頭

fseek

int fseek(FILE *fp, long int offset, int origin);

origin 三種取值:

  • SEEK_SET (0):文件開頭
  • SEEK_CUR (1):當前位置
  • SEEK_END (2):文件結尾
注意:以追加模式("a"/"a+")打開時,寫操作前 fseek/rewind 無效,數據始終追加到末尾。

其他常用函數速查表

函數原型功能返回值
ftelllong int ftell(FILE *fp)當前位置距文件開頭字節數出錯返回 -1L
feofint feof(FILE *fp)檢測是否到達文件末尾到達非0,否則0
ferrorint ferror(FILE *fp)檢測操作是否出錯出錯非0,否則0
removeint remove(const char *filename)刪除文件成功0,失敗非0
renameint rename(const char *old, const char *new)重命名文件成功0,失敗非0
freopenFILE* freopen(const char *filename, const char *mode, FILE *stream)重定向標準輸入/輸出成功返回流,失敗NULL
fcloseint fclose(FILE *stream)關閉流成功0,失敗-1

freopen 實戰:輸入輸出重定向

#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,控制台無輸出。

ftell 計算文件大小技巧

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 返回值或 0
  • 文本模式下 fseek 僅支援 SEEK_SET 配合 ftell 返回值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved