You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中持续读取文件?读取值不更新问题求助

循环读取/sys/class/power_supply/AC/online内容始终不更新的问题

我知道这是个简单问题,但似乎碰到了无法解释的编译器优化或幕后机制问题。

我写了一段未优化的简单代码,用来读取/sys/class/power_supply/AC/online文件,检查笔记本是否连接AC电源:

#include <stdio.h>

int main(void) {
    FILE* AC = fopen("/sys/class/power_supply/AC/online", "r");
    int online;

    while (1) {
        fscanf(AC, "%d", &online);
        fseek(AC, 0, SEEK_SET);
        printf("Online: %d\n", online);
    }

    fclose(AC);

    return 0;
}

我知道这段代码没有错误处理,也没有退出循环的方式,只是用来测试持续读取文件的功能。后续打算用inotify实现响应式读取而非轮询,但当前问题不在这。代码能读取文件,但不管怎么重新定位文件位置指示器,读取的值都不会更新,只有Ctrl+C终止程序重启后值才会变——因为重启时会重新打开文件。

我刚接触C语言,但不是编程新手,查资料后觉得这段代码应该能满足测试需求,但怎么试都解决不了问题。

已尝试的方法:

  • 用rewind()替代fseek()
  • 将fseek()移到fscanf()之前,确保从文件开头读取
  • 用malloc()在堆上手动分配online,再向指针写入数据
  • 通过unistd.h中的sleep()添加延迟

我几乎确定要么是忽略了C语言的某个基本特性,要么是有PC优化机制阻止循环中持续读取该文件。需要外部视角帮忙,现在已经卡壳了。

说明:编译时没开任何优化(用gcc -o main src/main.c && ./main),所以应该不是编译器优化的问题。

编辑:根据@JonathanLeffler的建议添加了clearerr,但没用:

#include <stdio.h>

int main(void) {
    FILE* AC = fopen("/sys/class/power_supply/AC/online", "r");
    int online;

    while (1) {
        fscanf(AC, "%d", &online);
        clearerr(AC);
        fseek(AC, 0, SEEK_SET);

        printf("Online: %d\n", online);
    }

    fclose(AC);

    return 0;
}

编辑2:更新测试代码查看文件状态,反而更困惑了:

#include <stdio.h>

int main(void) {
    FILE* AC = fopen("/sys/class/power_supply/AC/online", "r");
    int online;

    while (1) {
        fseek(AC, 0, SEEK_SET);
        fscanf(AC, "%d", &online);

        // 这段代码从未执行
        if (feof(AC) != 0) {
            printf("Hit EOF!\n");
            return 1;
        }

        // 这段代码从未执行
        if (ferror(AC) != 0) {
            printf("Clearing err!\n");
            clearerr(AC);
        }

        printf("Online: %d\n", online);
    }

    fclose(AC);

    return 0;
}

内容的提问来源于stack exchange,提问作者Frontear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:03:21