fseek
定义在头文件 <stdio.h> 中 |
||
int fseek( FILE* stream, long offset, int origin ); |
||
#define SEEK_SET /* 未指定 */ #define SEEK_CUR /* 未指定 */ |
||
将文件流 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 | - | 要修改的文件流 |
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) { // Prepare an array of double values. #define SIZE 5 double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0}; // Write array to a file. FILE * fp = fopen("test.bin", "wb"); fwrite(A, sizeof(double), SIZE, fp); fclose (fp); // Read the double values into array B. double B[SIZE]; fp = fopen("test.bin", "rb"); // Set the file position indicator in front of third double value. if (fseek(fp, sizeof(double) * 2L, SEEK_SET) != 0) { fprintf(stderr, "fseek() failed in file %s at line # %d\n", __FILE__, __LINE__ - 2); fclose(fp); return EXIT_FAILURE; } int ret_code = fread(B, sizeof(double), 1, fp); // reads one double value printf("ret_code == %d\n", ret_code); // prints the number of values read printf("B[0] == %.1f\n", B[0]); // prints one value fclose(fp); return EXIT_SUCCESS; }
可能的输出
ret_code == 1 B[0] == 3.0
[编辑] 参考文献
- C23 标准 (ISO/IEC 9899:2024)
- 7.23.9.2 fseek 函数 (p: TBD)
- C17 标准 (ISO/IEC 9899:2018)
- 7.21.9.2 fseek 函数 (p: 245)
- 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 函数
[编辑] 另请参阅
将文件位置指示器移动到文件中的特定位置 (函数) | |
获取文件位置指示器 (函数) | |
返回当前文件位置指示器 (函数) | |
将文件位置指示器移动到文件开头 (函数) | |
C++ 文档 for fseek
|