fseek

来自cppreference.com
< c‎ | io
 
 
文件输入/输出
类型与对象
函数
文件访问
直接输入/输出
无格式输入/输出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)
有格式输入
 
在标头 <stdio.h> 定义
int fseek( FILE* stream, long offset, int origin );
#define SEEK_SET    /* 未指明 */

#define SEEK_CUR    /* 未指明 */

#define SEEK_END    /* 未指明 */

设置文件流 stream 的文件位置指示器为 offset 所指向的值。

stream 以二进制模式打开,则新位置恰好是文件起始后(若 originSEEK_SET)或当前文件位置后(若 originSEEK_CUR),或文件结尾后(若 originSEEK_END)的 offset 字节。不要求二进制流支持 SEEK_END,尤其是当其输出中附加了空字节时。

stream 以文本模式打开,则仅有的受支持 offset 值为零(可用于任何 origin)和先前在关联到同一个文件的流上对 ftell 的调用的返回值(仅可用于 SEEK_SETorigin)。

stream 为宽取向,则文本和二进制流的限制均适用(允许 ftell 的结果与 SEEK_SET 一同使用,并允许零偏移量以 SEEK_SETSEEK_CUR 但非 SEEK_END 为基准)。

除了更改文件位置指示器, fseek 还撤销 ungetc 的效果并清除文件尾状态,如果适用。

若发生读或写错误,则设置流的错误指示器( ferror )而不影响文件位置。

参数

stream - 要修改的文件流
offset - 相对 origin 迁移的字符数
origin - offset 所加上的位置。它能拥有下列值之一:SEEK_SETSEEK_CURSEEK_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

参阅

将文件位置指示器移动到文件中的指定位置
(函数)
获取文件位置指示器
(函数)
返回当前的文件位置指示值
(函数)
将文件位置指示器移动到文件首
(函数)