C语言rewind函数详解:“文件时光倒流按钮”

一句话理解 rewind

「一键让文件‘时光倒流’到起点,同时清除所有错误状态,让文件重新焕发活力!」


函数原型

#include   // 必须包含头文件
void rewind(FILE *stream);

入口参数

参数

类型

比喻解释

stream

FILE*

文件的「时光机控制台」(文件指针)

返回参数

返回值

含义

永不失败(但需确保文件有效)


核心功能图解

文件内容:A B C D E F G H I J
当前游标在 F 的位置 → 调用 rewind → 游标回到 A

代码实例1:重复读取文件内容

场景:不关闭文件,反复读取同一文件

#include 

int main() {
    FILE *file = fopen("story.txt", "r");
    if (!file) {
        perror(" 故事书打不开");
        return 1;
    }

    // 第一次读取
    char buffer[100];
    printf("==== 第一遍阅读 ====\n");
    while (fgets(buffer, sizeof(buffer), file) {
        printf("%s", buffer);
    }

    // 时光倒流:回到起点 + 清除错误标志
    rewind(file);

    // 第二次读取
    printf("\n==== 第二遍阅读 ====\n");
    while (fgets(buffer, sizeof(buffer), file)) {
        printf("%s", buffer);
    }

    fclose(file);
    return 0;
}

代码实例2:修复错误状态

场景:处理文件错误后重试

#include 

int main() {
    FILE *file = fopen("data.bin", "rb");
    if (!file) {
        perror(" 磁盘异常");
        return 1;
    }

    // 尝试读取超出文件范围
    fseek(file, 1000, SEEK_SET);
    char data[10];
    if (fread(data, 1, 10, file) < 10) {
        if (feof(file)) {
            printf(" 已到文件末尾\n");
        } else if (ferror(file)) {
            printf(" 读取发生错误\n");
        }
    }

    // 时光倒流:重置错误状态并回到起点
    rewind(file);
    printf("错误状态已清除:%d\n", ferror(file));  // 输出0

    // 重新读取文件开头
    fread(data, 1, 10, file);
    printf("前10字节内容已读取\n");

    fclose(file);
    return 0;
}

技术细节剖析

1. 与 fseek 的微妙区别

操作

功能

是否清除错误标志

fseek(file, 0, SEEK_SET)

回到文件起点

保留错误标志

rewind(file)

回到起点 + 清除错误标志

彻底重置

2. 二进制/文本模式的影响

  • 文本模式下,rewind 会忽略换行符转换问题,直接回到真实起点:
// Windows系统下,文件中的 "\r\n" 会被转换为 "\n"
rewind(file);  // 依然定位到物理字节0的位置

3. 隐藏的副作用

  • 如果文件以追加模式("a")打开:
FILE *file = fopen("log.txt", "a");
rewind(file);         // 游标回到起点
fprintf(file, "Hi");  // 但写入时仍会自动跳到末尾!

致命误区

1. 对未打开的文件使用

FILE *file = NULL;
rewind(file);  //  程序崩溃!

2. 忽略错误处理

// 即使 rewind 清除了错误,仍需检查后续操作
rewind(file);
if (fread(...) == 0) {  // 文件可能为空
    printf("文件内容为空\n");
}

高级技巧:快速清空文件

// 打开文件后立即 rewind + truncate
FILE *file = fopen("temp.txt", "r+");  // 读写模式
rewind(file);                          // 回到起点
ftruncate(fileno(file), 0);            // 清空文件(UNIX系统)

对比 freopen

操作

功能

资源消耗

rewind

重置已有文件指针

freopen

关闭并重新打开文件


总结

  • 核心功能:重置文件指针到起点 + 清除错误标志
  • 必用场景:重复读取文件、错误恢复、日志轮转
  • 类比记忆:就像录音机的「倒带并重置」按钮,rewind 是让文件操作重新开始的「时光重置器」