fseek

来自cppreference.com
< c‎ | io
定义于头文件 <stdio.h>
int fseek( FILE *stream, long offset, int origin );

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

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

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

stream 为宽面向,则一同应用对文本和二进制流的限制(允许 ftell 的结果与 SEEK_SET 一同使用,并允许零 offset 以 SEEK_SET 和 SEEK_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 ,若有任何未写入数据(但是否恢复迁移状态是实现定义的)。

示例

fseek 带错误检查

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    // 准备浮点值的数组。
    #define SIZE 5
    double A[SIZE] = {1.,2.,3.,4.,5.};
    // 写入数组到文件。
    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)
    {
       if (ferror(fp))
       {
          perror("fseek()");
          fprintf(stderr,"fseek() failed in file %s at line # %d\n", __FILE__,__LINE__-5);
          exit(EXIT_FAILURE);
       }
    }
 
    int ret_code = fread(B,sizeof(double),1,fp);   // 读取一个浮点值
    printf("%.1f\n", B[0]);                        // 打印一个浮点值
 
    fclose(fp);
    return EXIT_SUCCESS;
}

输出:

3.0

引用

  • C11 standard (ISO/IEC 9899:2011):
  • 7.21.9.2 The fseek function (p: 336-337)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.19.9.2 The fseek function (p: 302-303)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.9.9.2 The fseek function

参阅

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