首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言 fseek/ftell 位置不匹配:原點參數與返回值誤區

     編輯:程式設計綜合問答

現象

fseek(fp, i, SEEK_SET); 後 ftell(fp) 返回 i+1,至第 290 字節時返回 802。

核心知識點

  1. fseek 第三參數決定原點:
    • SEEK_SET:文件開頭
    • SEEK_CUR:當前位置
    • SEEK_END:文件結尾
    若誤用 SEEK_CUR 會導致位置疊加偏移。
  2. ftell 返回長整型偏移量:單位為字節,成功返回位置,失敗返回 -1L。
  3. 文本模式下換行符轉換:Windows "r" 模式讀取 \r\n 轉為 \n,導致邏輯位置與物理字節數不一致,隨文件增大誤差累積(解釋 290→802)。

修正代碼


FILE *fp = fopen("data.bin", "rb"); // 必須二進制模式
if (!fp) return;

long pos = 290;
if (fseek(fp, pos, SEEK_SET) != 0) { perror("fseek"); return; }
long actual = ftell(fp);
printf("目標 %ld, 實際 %ld\n", pos, actual); // 應相等

調試檢查清單

  • 檢查 fopen 模式是否為 "rb"/"wb"。
  • 確認 fseek 返回值為 0(成功)。
  • 對比 ftell 與預期位置,若系統性偏移 1 字節,檢查是否混用 SEEK_CUR。
  • 大文件(>2GB)需用 fseeko64/ftello64 避免長整型溢出。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved