Namespaces
Variants

fsetpos

From cppreference.net
< c ‎ | io
定义于头文件 <stdio.h>
int fsetpos ( FILE * stream, const fpos_t * pos ) ;

根据 pos 所指向的值,设置文件流 stream 的文件位置指示器及多字节解析状态(如果存在)。

除了建立新的解析状态和位置外,调用此函数会撤销 ungetc 的效果,并清除已设置的文件结束状态。

如果发生读取或写入错误,流的错误指示器( ferror )将被设置。

目录

参数

stream - 要修改的文件流
pos - 指向 fpos_t 对象的指针,用作文件位置指示器的新值

返回值

0 表示成功,非零值表示失败。

注释

在宽流中定位到非结尾位置后,下一次调用任何输出函数都可能使文件剩余部分变为未定义状态,例如通过输出不同长度的多字节序列。

示例

fsetpos 带错误检查

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    // 准备浮点数值数组
    #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);
    // 将浮点数值读入数组B
    double B[SIZE];
    fp = fopen("test.bin","rb");
    fpos_t pos;
    if (fgetpos(fp, &pos)) // 当前位置:文件起始处
    {
        perror("fgetpos()");
        fprintf(stderr, "fgetpos() failed in file %s at line # %d\n",
                __FILE__, __LINE__ - 3);
        exit(EXIT_FAILURE);
    }
    int ret_code = fread(B,sizeof(double),1,fp); // 读取一个浮点数值
    // 当前位置:读取一个浮点值后
    printf("%.1f; read count = %d\n", B[0], ret_code); // 打印一个浮点值和返回码
    if (fsetpos(fp, &pos)) // 将当前位置重置到文件起始处
    {
        if (ferror(fp))
        {
            perror("fsetpos()");
            fprintf(stderr, "fsetpos() failed in file %s at line # %d\n", __FILE__,
                    __LINE__ - 5);
            exit(EXIT_FAILURE);
        }
    }
    ret_code = fread(B, sizeof(double), 1, fp); // 重新读取第一个浮点数值
    printf("%.1f; read count = %d\n", B[0], ret_code); // 打印一个浮点值和返回码
    fclose(fp);
    return EXIT_SUCCESS;
}

可能的输出:

1.0; read count = 1
1.0; read count = 1

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 7.21.9.3 fsetpos 函数 (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 7.21.9.3 fsetpos 函数 (p: TBD)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.21.9.3 fsetpos 函数 (p: 337)
  • C99标准(ISO/IEC 9899:1999):
  • 7.19.9.3 fsetpos函数(页数:303)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.9.9.3 fsetpos 函数

参见

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