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

C語言獲取文件大小:fseek 與 ftell 完整指南

     編輯:關於C語言

前言

在 C 語言開發中,我們經常需要在讀取文件前預先得知文件大小,以便分配合適的緩衝區、執行文件拷貝或動態創建數組。標準庫函數 fseek 和 ftell 組合使用,即可輕鬆實現這一需求。

核心函數解析

1. fseek —— 移動文件指針

函數原型:
int fseek(FILE *stream, long int offset, int whence);

  • stream:目標文件流指針。
  • whence:基準位置,取值如下:
    • SEEK_SET:文件開頭
    • SEEK_CUR:當前位置
    • SEEK_END:文件結尾
  • offset:相對於 whence 的偏移量(字節)。
  • 返回值:成功返回 0,失敗返回非零值。

簡單說,fseek 將文件指針從指定基準位置移動 offset 字節。

2. ftell —— 獲取當前指針位置

函數原型:
long int ftell(FILE *stream);

  • 功能:返回文件指針距離文件開頭的字節數。
  • 返回值:當前位置偏移量(長整型),出錯返回 -1L。

實戰:計算文件大小

邏輯很直觀:先用 fseek(fp, 0, SEEK_END) 將指針移至文件末尾,再用 ftell(fp) 讀取此時的偏移量,即為文件總字節數。

完整代碼示例

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp = fopen("addoverflowDemo.c", "r");
    if (fp == NULL) {
        perror("文件打開失敗");
        return EXIT_FAILURE;
    }

    // 移動指針到文件末尾
    if (fseek(fp, 0, SEEK_END) != 0) {
        perror("fseek 失敗");
        fclose(fp);
        return EXIT_FAILURE;
    }

    // 獲取當前位置 = 文件大小
    long size = ftell(fp);
    if (size == -1L) {
        perror("ftell 失敗");
    } else {
        printf("文件大小:%ld 字節\n", size);
    }

    fclose(fp);
    return EXIT_SUCCESS;
}

運行結果

文件大小:309 字節

注意事項

  • 二進制模式("rb")下結果最精確,文本模式在 Windows 上可能因換行符轉換導致偏差。
  • 大文件(>2GB)建議使用 fseeko/ftello 或 _fseeki64/_ftelli64 避免溢位。
  • 別忘了檢查 fopen、fseek、ftell 的返回值,增強健壯性。

總結

fseek + ftell 是 C 語言獲取文件大小的經典組合,代碼簡潔、移植性好,是每位 C 程序員必備的基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved