跳到主要内容

C++ fseek() 函数

fseek() 函数定义在 <cstdio> 头文件中。

fseek() 函数原型

int fseek(FILE* stream, long offset, int origin);

如果文件以二进制模式打开,文件指针的新位置将精确地从起点偏移 offset 字节。

如果文件以文本模式打开,offset 支持的值有:

  • 零:它与任何值的 origin 兼容,即 SEEK_SET、SEEK_CUR 和 SEEK_END。
  • 通过调用 ftell(stream) 返回的值:它仅与 SEEK_SET 的 origin 兼容。

如果流是宽字符定向的,文本和二进制流的限制都适用,即允许使用 SEEK_SET 的 ftell 结果和从 SEEK_SET 和 SEEK_CUR 允许的零偏移,但不允许从 SEEK_END。

fseek 函数还撤销 ungetc 的效果,并清除文件结束状态(如果适用)。

如果发生读写错误,将设置 ferror 并且文件位置不受影响。

fseek() 参数

  • stream:要修改的文件流。
  • offset:从起点偏移的字符数。
  • origin:用作参考的位置以添加到偏移量。它可以有以下值:

fseek() 的 origin 值

描述
SEEK_SET文件开始处
SEEK_CUR文件指针的当前位置
SEEK_END文件末尾

fseek() 返回值

  • 成功时 fseek() 函数返回零,否则返回非零值。

示例:fseek() 函数如何工作?

#include <cstdio>

int main()
{
FILE* fp = fopen("example.txt","w+");
char ch;

fputs("Erica 25 Berlin", fp);
rewind(fp);

printf("姓名:");
while((ch=fgetc(fp))!=' ')
putchar(ch);
putchar('\n');

printf("年龄:");
fseek(fp,10,SEEK_SET);
while((ch=fgetc(fp))!=' ')
putchar(ch);
putchar('\n');

printf("城市:");
fseek(fp,15,SEEK_SET);
while((ch=fgetc(fp))!=EOF)
putchar(ch);
putchar('\n');

fclose(fp);
return 0;
}

当你运行程序时,输出将会是:

姓名:Erica
年龄:25
城市:Berlin