命名空间
变体
操作

fseek

来自 cppreference.cn
< c‎ | io
 
 
文件输入/输出
类型和对象
        
函数
文件访问
(C95)
无格式输入/输出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

格式化输入
 
定义于头文件 <stdio.h>
int fseek( FILE* stream, long offset, int origin );
#define SEEK_SET    /* unspecified */

#define SEEK_CUR    /* unspecified */

#define SEEK_END    /* unspecified */

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

如果 stream 以二进制模式打开,则新位置是从文件开头算起的 offset 字节数(如果 originSEEK_SET),从当前文件位置算起的 offset 字节数(如果 originSEEK_CUR),以及从文件末尾算起的 offset 字节数(如果 originSEEK_END)。二进制流不一定支持 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_SET, SEEK_CUR, SEEK_END

[编辑] 返回值

0 成功时返回 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)
{
    // 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