C 参考手册
- C 语言
- C 关键词
- 预处理器
- C 标准库头文件
- 类型支持
- 程序支持工具
- 变参数函数
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 算法
- 数值
- 文件输入/输出
- gets, gets_s
- printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s
- fopen, fopen_s
- fputc, putc
- fputs
- getchar
- putchar
- FILE
- fpos_t
- stdin, stdout, stderr
- freopen, freopen_s
- fwide
- setbuf
- setvbuf
- fclose
- fflush
- fread
- fwrite
- fgetc, getc
- fgets
- puts
- ungetc
- fgetwc
- fgetws
- fputwc, putwc
- fputws
- getwchar
- putwchar
- ungetwc
- scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s
- wscanf, fwscanf, swscanf, wscanf_s, fwscanf_s, swscanf_s
- vscanf, vfscanf, vsscanf, vscanf_s, vfscanf_s, vsscanf_s
- vwscanf, vfwscanf, vswscanf, vwscanf_s, vfwscanf_s, vswscanf_s
- wprintf, fwprintf, swprintf, wprintf_s, fwprintf_s, swprintf_s, snwprintf_s
- vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s
- vwprintf, vfwprintf, vswprintf, vwprintf_s, vfwprintf_s, vswprintf_s, vsnwprintf_s
- ftell
- fgetpos
- fseek
- fsetpos
- rewind
- clearerr
- feof
- ferror
- perror
- remove
- rename
- tmpfile, tmpfile_s
- tmpnam, tmpnam_s
- 本地化支持
- 原子操作库
- 线程支持库
- 实验性 C 标准库
- 有用的资源
- 符号索引
- 注释
fseek
定义于头文件 <stdio.h>
|
||
int fseek( FILE *stream, long offset, int origin ); |
||
设置文件流 stream
的文件位置指示器为 offset
所指向的值。
若 stream
以二进制模式打开,则新位置准确地是文件起始后(若 origin
为 SEEK_SET )或当前文件位置后(若 origin
为 SEEK_CUR ),或文件结尾后(若 origin
为 SEEK_END )的 offset
字节。不要求二进制流支持 SEEK_END ,尤其是是否输出附加的空字节。
若 stream
以文本模式打开,则仅有的受支持 offset
值为零(可用于任何 origin
)和先前在关联到同一个文件的流上对 ftell 的调用的返回值(仅可用于 SEEK_SET 的 origin
)。
若 stream
为宽面向,则一同应用对文本和二进制流的限制(允许 ftell 的结果与 SEEK_SET 一同使用,并允许零 offset 以 SEEK_SET 和 SEEK_CUR 但非 SEEK_END 为基准)。
除了更改文件位置指示器, fseek
还撤销 ungetc 的效果并清除文件尾状态,若可应用。
若发生读或写错误,则设置流的错误指示器( ferror )而不影响文件位置。
参数
stream | - | 要修改的文件流 |
offset | - | 相对 origin 迁移的字符数 |
origin | - | offset 所加上的位置。它能拥有下列值之一: SEEK_SET 、 SEEK_CUR 、 SEEK_END
|
返回值
成功时为 0 ,否则为非零。
注意
在巡位到宽流的非结尾位置后,下个对任意输出函数的调用可能令剩下的文件内容未定义,例如通过输出一个长度不同的多字节序列。
对于文本流, offset
仅有的合法值是 0 (可应用于任意 origin
)和先前 ftell 调用的返回值(仅可应用于 SEEK_SET
)。
POSIX 允许在文件尾之后巡位。若在此巡位后进行输出,则任何间隙中的读取将返回零字节。在文件系统支持的场合,这会创建一个稀疏文件。
POSIX 亦要求 fseek 先进行 fflush ,若有任何未写入数据(但是否恢复迁移状态是实现定义的)。
示例
fseek 带错误检查
#include <stdio.h> #include <stdlib.h> int main(void) { // 准备浮点值的数组。 #define SIZE 5 double A[SIZE] = {1.,2.,3.,4.,5.}; // 写入数组到文件。 FILE * fp = fopen("test.bin", "wb"); fwrite(A,sizeof(double),SIZE,fp); fclose (fp); // 读浮点值入数组 B。 double B[SIZE]; fp = fopen("test.bin","rb"); // 设置文件位置指示器到第三个浮点值之前。 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); // 读取一个浮点值 printf("%.1f\n", B[0]); // 打印一个浮点值 fclose(fp); return EXIT_SUCCESS; }
输出:
3.0
引用
- C11 standard (ISO/IEC 9899:2011):
- 7.21.9.2 The fseek function (p: 336-337)