fseek
在标头 <stdio.h> 定义
|
||
int fseek( FILE* stream, long offset, int origin ); |
||
#define SEEK_SET /* 未指明 */ #define SEEK_CUR /* 未指明 */ |
||
设置文件流 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 一同使用,并允许零偏移量以 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 ,若有任何未写入数据(但是否恢复迁移状态是实现定义的)。
POSIX 规定,fseek
错误时应返回 -1,并设置 errno 以标明该错误。
示例
fseek
及错误检查
#include <stdio.h> #include <stdlib.h> int main(void) { // 准备 double 值的数组。 #define SIZE 5 double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0}; // 将数组写入文件。 FILE * fp = fopen("test.bin", "wb"); fwrite(A, sizeof(double), SIZE, fp); fclose (fp); // 将各 double 值读取到数组 B 中。 double B[SIZE]; fp = fopen("test.bin", "rb"); // 设置文件位置指示器到第三个 double 值之前。 if (fseek(fp, sizeof(double) * 2L, SEEK_SET) != 0) { fprintf(stderr, "fseek() 失败,文件 %s 行 # %d\n", __FILE__, __LINE__ - 2); fclose(fp); return EXIT_FAILURE; } int ret_code = fread(B, sizeof(double), 1, fp); // 读取一个 double 值 printf("ret_code == %d\n", ret_code); // 打印所读取值的数量 printf("B[0] == %.1f\n", B[0]); // 打印一个值 fclose(fp); return EXIT_SUCCESS; }
可能的输出:
ret_code == 1 B[0] == 3.0
引用
- C23 标准(ISO/IEC 9899:2024):
- 7.23.9.2 The fseek function (第 TBD 页)
- C17 标准(ISO/IEC 9899:2018):
- 7.21.9.2 The fseek function (第 245 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.21.9.2 The fseek function (第 336-337 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.19.9.2 The fseek function (第 302-303 页)
- C89/C90 标准(ISO/IEC 9899:1990):
- 4.9.9.2 The fseek function
参阅
将文件位置指示器移动到文件中的指定位置 (函数) | |
获取文件位置指示器 (函数) | |
返回当前的文件位置指示值 (函数) | |
将文件位置指示器移动到文件首 (函数) |