如何在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
相关产品推荐
相关产品推荐

