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.};
    /* Write array to a file. */
    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

[编辑] 参阅

将文件位置指示器移动到文件中的指定位置
(函数) [编辑]
获取文件位置指示器
(函数) [编辑]
返回当前的文件位置指示值
(函数) [编辑]
将文件位置指示器移动到文件首
(函数) [编辑]
fseekC++ 文档