Appearance
alias: rewind()
fseek()
c
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);第一个参数是文件指针,它是指向FILE类型结构体的指针,通常由fopen()函数返回。
第二个参数指定了偏移量,它表示需要移动的字节数,其类型是long int。注意偏移量可以是负数,如果类型为unsigned long,则不能使用负数。
第三个参数是移动模式,即相对于哪个位置来计算偏移量,它可以取如下值之一:
SEEK_SET:将文件指针从文件开头开始移动offset个字节。文件首SEEK_CUR:将文件指针从当前位置开始移动offset个字节。当前位置SEEK_END:将文件指针从文件末尾位置开始移动offset个字节。文件尾
函数返回值为0表示成功,非0表示出错。
使用fseek函数可以实现随机访问文件,即可以跳转到文件的任意位置进行读写操作。注意在使用fseek函数时需要非常小心,需要确保文件指针和文件的当前状态是一致的,否则可能会造成意想不到的错误。在一些特殊的应用场合中,可以使用#ftell()函数来获取当前文件指针相对于文件开头的偏移量,然后再借助fseek函数实现定位。
定位到文件开头后面4bytes的位置:
txt
fseek(fp, 4, SEEK_SET);
ABCDEFGHIJK
↑定位到文件末尾前4bytes的位置:
txt
fseek(fp, -4, SEEK_END);
ABCDEFGHIJK
↑如果是正 4,文件将在末尾扩展 4 字节。
因为 fseek 的第二个参数类型是 long ,在不同的操作系统上它的范围是不一样的,有的操作系统可能能够偏移的范围只有 2 GB ( 4 GB 折半,因为是有符号 long )。有一个方法是使用 fseeko() 替换,但是 fseeko() 不是 c99 标准,会使得代码移植性很差。[^1]
fseek 在空洞文件上的应用:程序在创建文件的时候希望在写入实际的数据前占用掉系统磁盘的空间(比如下载器),就需要使用空洞文件。实现空洞文件的方法是使用 fseek 函数。
rewind()
函数原型 :
c
void rewind(FILE *stream);移动到文件头部,相当于:
c
(void) fseek(stream, 0L, SEEK_SET)ftell()
函数原型:
c
long ftell(FILE *stream);获取当前文件的相对起始位置的偏移量,比如打开文件后,通过#fseek()定位到 100 字节的地方,然后再调用 fetll 将返回100。
[^1]: 李慧琴 Linux C 08: 11. 08.标准IO-fseeko和ftello_哔哩哔哩_bilibili