1. 文件操作三剑客:fseek、fread、ftell的定位艺术
在C语言文件处理中,fseek、fread和ftell这三个函数就像外科医生的手术器械——各自独立却又必须配合使用。它们共同构成了文件随机访问的核心工具链,允许我们像操作内存数组一样精确控制文件指针的位置,实现高效的数据读写。不同于顺序读取的fgets或fscanf,这套组合拳特别适合处理二进制文件、大数据块读取和需要频繁定位的场景。
2. fseek:文件指针的GPS导航
2.1 函数原型与基本用法
c复制int fseek(FILE *stream, long offset, int origin);
这个看似简单的函数藏着三个关键参数:文件流指针stream、偏移量offset和基准点origin。其中origin参数决定了导航的起点,它有三个预定义常量:
- SEEK_SET(文件开头)
- SEEK_CUR(当前位置)
- SEEK_END(文件末尾)
比如要跳到文件开头后第100字节处:
c复制fseek(fp, 100, SEEK_SET);
2.2 偏移量的正负玄机
当origin为SEEK_CUR时,offset可以是正数(向后移动)或负数(向前移动)。但有个重要限制:除了SEEK_END之外,其他基准点配合负偏移可能导致指针跑到文件开头之前,这是未定义行为。我曾在一个日志解析项目中踩过这个坑——试图回退读取时没有检查当前位置,导致程序崩溃。
经验法则:使用fseek前先用ftell记录当前位置,移动后再次确认是否到达预期位置
3. ftell:文件指针的坐标记录仪
3.1 获取当前位置的精确值
c复制long ftell(FILE *stream);
这个看似简单的函数返回的是从文件开头到当前指针位置的字节偏移量。但在实际使用中要注意:
- 返回值类型是long,处理超过2GB的文件时可能溢出
- 某些系统(如Windows)在文本模式下返回值可能不准确
3.2 文件大小的测量技巧
组合使用fseek和ftell可以准确获取文件大小:
c复制fseek(fp, 0, SEEK_END);
long file_size = ftell(fp);
fseek(fp, 0
