c - 为什么 rewind() 后跟 fscanf() 不反映在磁盘上所做的更改?
问题描述
我反复使用fscanf
and读取以前打开的文件rewind
:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
void read_opened_file(FILE *file, int *value)
{
errno = 0;
fscanf(file, "%d", value);
if (errno != 0) perror("fscanf error");
errno = 0;
rewind(file);
if (errno != 0) perror("rewind error");
}
int main(int argc, char* argv[])
{
int value = 0;
FILE *file = fopen(argv[1], "r");
errno = 0;
if (setvbuf(file, NULL, _IONBF, 0) != 0) perror("setvbuf error");
for (int i = 0; i < 10; ++i)
{
read_opened_file(file, &value);
printf("value = %d\n", value); fflush(stdout);
sleep(1);
}
fclose(file);
return 0;
}
但是,在后台对磁盘上的文件所做的任何更改gedit
都不会反映出来:该函数会不断报告第一个(缓存?)读取的值(并且未设置)。echo >
cp
errno
- 当我按照这里
setvbuf(file, NULL, _IONBUF, 0);
的建议时,和所做的更改被反映,但仍然没有反映所做的更改。cp
echo >
gedit
- 当我使用
fopen
并且fclose
每次循环迭代时,一切都按预期进行。
如何在没有 fopen
和fclose
每次的情况下修复上述代码?
解决方案
你不能。该gedit
程序不会更改文件。这根本不是它的工作原理。所以你不会看到文件有任何变化。
所做的更改gedit
是通过用新文件替换旧文件来完成的。您必须关闭旧文件并打开新文件才能查看所做的更改gedit
。
推荐阅读
- android - 共享实时数据 Android
- python - 我怎样才能使这个条件为“几乎”随机游走?
- python - scipy.optimize.differential_evolution 评估要最小化的函数多少次?
- android - Android:layout_centerHorizontal vs layout_centerVertical
- php - PHP Switch 想要在代码中破坏 html
- java - 使用 JDBC 检查查询中使用的内存(RAM)
- reactjs - 为什么 re-run 只用 react-hooks-testing-libary 更新一次 props?
- javascript - 奇怪的过度滚动行为
- python - 了解事件过滤器以及它们在 PyQt 中的工作方式
- css - 在 Rails 中添加 link_to 后,我似乎无法在 CSS 中定位 navbar-brand 元素