fseek
|
定义于头文件
<stdio.h>
|
||
|
int
fseek
(
FILE
*
stream,
long
offset,
int
origin
)
;
|
||
|
#define SEEK_SET /* 未指定 */
#define SEEK_CUR /* 未指定 */
|
||
将文件流 stream 的文件位置指示器设置为 offset 所指向的值。
如果 stream 以二进制模式打开,当 origin 为 SEEK_SET 时,新位置是从文件开头精确计算的 offset 字节;当 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 | - | offset 所基于的参考位置。可选用以下值之一: SEEK_SET 、 SEEK_CUR 、 SEEK_END |
返回值
0 表示成功,非零值表示失败。
注释
在宽流中定位到非结尾位置后,对任何输出函数的下一次调用可能使文件剩余部分变为未定义状态,例如通过输出不同长度的多字节序列。
对于文本流, offset 唯一有效的取值是 0 (适用于任何 origin )以及先前调用 ftell 返回的值(仅适用于 SEEK_SET )。
POSIX 允许寻址到超出文件现有末尾的位置。若在此寻址后执行输出操作,从间隙处读取将返回零字节。在文件系统支持的情况下,这会创建一个 稀疏文件 。
POSIX 还要求
fseek
首先执行
fflush
(如果存在未写入的数据),但移位状态是否恢复由实现定义。
POSIX 规定,
fseek
应在出错时返回
-
1
,并设置
errno
以指示具体错误。
在 Windows 系统上,可使用
_fseeki64
处理大于 2 GiB 的文件。
示例
fseek
带错误检查:
#include <stdio.h> #include <stdlib.h> int main(void) { // 准备双精度浮点数值数组 #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); // 将双精度浮点数值读入数组B double B[SIZE]; fp = fopen("test.bin", "rb"); // 将文件位置指示器设置在第三个双精度浮点数值前 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); // 读取一个双精度浮点数值 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 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 函数 (页: 336-337)
- C99标准(ISO/IEC 9899:1999):
-
- 7.19.9.2 fseek函数(页码:302-303)
- C89/C90 标准 (ISO/IEC 9899:1990):
-
- 4.9.9.2 fseek 函数
参见
|
将文件位置指示器移动到文件中的特定位置
(函数) |
|
|
获取文件位置指示器
(函数) |
|
|
返回当前文件位置指示器
(函数) |
|
|
将文件位置指示器移动到文件开头
(函数) |
|
|
C++ documentation
for
fseek
|
|