fseek
是C标准库中用于设置文件位置指针的函数,定义在 <stdio.h>
头文件中。它允许随机访问文件中的任意位置。
函数原型
int fseek(FILE *stream, long offset, int origin);
参数说明
1. stream
参数
类型:FILE*
含义:指向已打开文件的指针,通常由 fopen()
返回
2. offset
参数
类型:long
含义:从 origin
指定的位置开始的偏移量(以字节为单位)
-
- 可以是正数(表示向前移动)或负数(表示向后移动)
- 零表示不移动
3. origin
参数
- 类型:
int
- 含义:偏移的基准位置,可以是以下三个宏之一:
宏定义 | 值 | 含义 |
| 0 | 文件开头 |
| 1 | 当前文件位置指针的位置 |
| 2 | 文件末尾 |
返回值
- 成功:返回0
- 失败:返回非零值(通常是-1)
使用示例
1. 移动到文件开头
fseek(file, 0L, SEEK_SET); // 移动到文件开始处
2. 向前移动100字节
fseek(file, 100L, SEEK_CUR); // 从当前位置向前移动100字节
3. 获取文件大小(移动到末尾并获取位置)
fseek(file, 0L, SEEK_END); // 移动到文件末尾
long file_size = ftell(file); // 获取当前位置(即文件大小)
fseek(file, 0L, SEEK_SET); // 移回文件开头
4. 向后移动50字节
fseek(file, -50L, SEEK_CUR); // 从当前位置向后移动50字节
注意事项
- 二进制文件与文本文件:
-
- 对于二进制文件,
offset
精确对应字节数 - 对于文本文件,
offset
必须为0或ftell()
返回的值
- 对于二进制文件,
- 大文件支持:
-
- 标准
fseek()
使用long
类型,可能不足以处理大文件 - 对于大文件,可使用
fseeko()
(POSIX)或_fseeki64()
(Windows)
- 标准
- 有效性检查:
-
- 使用前应确保文件已成功打开
- 检查返回值以确认操作是否成功
- 与
ftell()
配合使用:
-
ftell()
可以获取当前文件位置- 两者常配合使用实现文件随机访问
- 缓冲区影响:
-
- 在调用
fseek()
前可能需要fflush()
确保缓冲区已写入
- 在调用
错误处理
if (fseek(file, offset, origin) != 0) {
perror("fseek failed");
// 处理错误
}
fseek
是文件随机访问的核心函数,合理使用可以实现高效的文件操作,特别适合处理大型数据文件或需要频繁定位的场景。