©
本文档使用
php.cn手册 发布
在头文件<stdio.h>中定义 |
---|
int fseek(FILE * stream,long offset,int origin); |
将文件流的文件位置指示符设置为stream
指向的值offset
。
如果stream
以二进制模式打开,则新位置是offset
从文件开始处测量的字节(如果origin
是)SEEK_SET
,从当前文件位置(如果origin
是)SEEK_CUR
,以及从文件结尾(如果origin
是)开始SEEK_END
。二进制流不需要支持SEEK_END
,特别是如果输出额外的空字节。
如果stream
是在文本模式下打开,对于仅支持值offset
为零(这与任何工作origin
),并通过先前调用返回的值ftell
与同一文件(仅与工作相关的物流origin
的SEEK_SET
)。
如果stream
是面向广域的,则应用文本流和二进制流的限制(ftell
SEEK_SET允许使用结果,SEEK_SET和SEEK_CUR允许使用零偏移量,但不允许SEEK_END)。
除了更改文件位置指示符之外,还可以fseek
取消ungetc
文件结束状态的效果并清除文件结束状态(如果适用)。
如果发生读取或写入错误,则会ferror
设置stream()的错误指示符并且文件位置不受影响。
流 | - | 文件流进行修改 |
---|---|---|
抵消 | - | 将位置相对于原点移动的字符数 |
起源 | - | 添加了偏移量的位置。它可以具有以下值之一:SEEK_SET,SEEK_CUR,SEEK_END |
0
一旦成功,否则非零值。
在宽流中寻找非终点位置之后,对任何输出函数的下一次调用可能会使文件的其余部分不确定,例如通过输出不同长度的多字节序列。
对于文本流,唯一有效的值offset
是0
(适用于任何origin
)和先前调用返回的值ftell
(仅适用于SEEK_SET
)。
POSIX允许在现有的文件结尾之外寻找。如果在此查找后执行输出,则从间隙读取的数据将返回零字节。在文件系统支持的地方,这将创建一个稀疏文件。
fflush
如果有任何未写入的数据(但是移位状态是否恢复为实现定义),POSIX还要求fseek首先执行。
带有错误检查的fseek。
#include <stdio.h>#include <stdlib.h> int main(void){ /* Prepare an array of f-p values. */ #define SIZE 5 double A[SIZE] = {1.,2.,3.,4.,5.}; /* Write array to a file. */ FILE * fp = fopen("test.bin", "wb"); fwrite(A,sizeof(double),SIZE,fp); fclose (fp); /* Read the f-p values into array B. */ double B[SIZE]; fp = fopen("test.bin","rb"); /* Set the file position indicator in front of third f-p value. */ if (fseek(fp,sizeof(double)*2L,SEEK_SET) != 0) { if (ferror(fp)) { perror("fseek()"); fprintf(stderr,"fseek() failed in file %s at line # %d\n", __FILE__,__LINE__-5); exit(EXIT_FAILURE); } } int ret_code = fread(B,sizeof(double),1,fp); /* read one f-p value */ printf("%.1f\n", B[0]); /* print one f-p value */ fclose(fp); return EXIT_SUCCESS;}
输出:
3.0
C11标准(ISO / IEC 9899:2011):
7.21.9.2 fseek函数(p:336-337)
C99标准(ISO / IEC 9899:1999):
7.19.9.2 fseek函数(p:302-303)
C89 / C90标准(ISO / IEC 9899:1990):
4.9.9.2 fseek函数