C- fseek() & ftell()

fseek()

fseek() 是 C 语言中的标准库函数,它用于设置文件位置指针的位置。这个位置指针决定了下一次读取或写入操作的起始位置。使用 fseek() 可以在文件中随机访问,这意味着我们不必按顺序读取或写入文件。

函数原型:

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

参数:

  1. stream: 要移动其位置指针的文件的 FILE 指针。
  2. offset: 从基准位置 whence 开始的位移(以字节为单位)。
  3. whence: 基准位置,它可以是以下之一:
    • SEEK_SET: 文件的开头。
    • SEEK_CUR: 当前文件位置指针的位置。
    • SEEK_END: 文件的结尾。

返回值:

  • 如果成功,则返回 0。
  • 如果发生错误,则返回非零值。

示例:

假设我们有一个文件 data.bin,它包含了连续存储的整数。我们希望跳过前两个整数并读取第三个整数。以下是如何使用 fseek() 完成此任务的示例:

#include <stdio.h>

int main() {
    FILE *file;
    int value;

    file = fopen("data.bin", "rb");
    if (file == NULL) {
        perror("Failed to open file");
        return 1;
    }

    // 跳过前两个整数
    if (fseek(file, 2 * sizeof(int), SEEK_SET) != 0) {
        perror("Failed to seek in the file");
        fclose(file);
        return 2;
    }

    // 读取第三个整数
    fread(&value, sizeof(int), 1, file);
    printf("The third integer is: %d\n", value);

    fclose(file);
    return 0;
}

在上面的示例中,我们使用 fseek() 来跳过文件中的前两个整数。注意,我们使用 SEEK_SET 作为 whence 参数,这意味着 offset 是相对于文件开始的位置。

注意:当我们使用 fseek() 后,任何由 feof()ferror() 设置的错误或文件结束指示符都会被清除。另外,使用 fseek() 后,写入操作可能会在文件中产生一个“空洞”,这在某些文件系统上可能会产生未初始化的数据块。

ftell()

ftell() 是 C 语言标准库中的一个函数,用于获取当前文件位置指针的位置。通常与 fseek() 配合使用,fseek() 用于设置文件位置,而 ftell() 用于查询当前的文件位置。

函数原型:

long ftell(FILE *stream);

参数:

  • stream: 要查询其位置指针位置的文件的 FILE 指针。

返回值:

  • 成功时,返回当前文件位置指针的位置(以字节为单位,从文件开始处计算)。
  • 失败时,返回 -1L 并设置错误指示符。

示例:

考虑一个简单的示例,其中我们首先向一个文件中写入一些数据,然后使用 ftell() 来获取文件位置,接着再写入更多的数据:

#include <stdio.h>

int main() {
    FILE *file;
    long position;

    file = fopen("data.txt", "w+");
    if (file == NULL) {
        perror("Failed to open file");
        return 1;
    }

    // 写入一些文本
    fputs("Hello, World!", file);

    // 获取当前文件位置
    position = ftell(file);
    printf("Current file position: %ld\n", position);

    // 写入更多文本
    fputs("\nMore text here.", file);

    fclose(file);
    return 0;
}

在上述示例中,我们首先打开一个文件并写入 “Hello, World!”,然后使用 ftell() 获取当前的文件位置(这应该是 “Hello, World!” 之后的位置)。接着,我们继续在文件中写入更多的文本。

注意:在二进制模式下,文件位置可以被视为文件中的字节偏移量,但在文本模式下,由于平台特定的换行符转换(例如,Windows 使用 \r\n 作为换行符,而 Unix-like 系统使用 \n),返回的文件位置可能不直接对应于字节数量。因此,在文本模式下使用 ftell() 时,最好只与 fseek() 一起使用,并避免直接解释返回的位置值。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青衫客36

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值