为什么 fscanf() 后跟的 rewind() 不反映磁盘上所做的更改?

Why rewind() followed by fscanf() do not reflect changes made on disk?

我正在使用 fscanfrewind:

重复读取之前打开的文件
#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;
}

但是,geditecho >cp 在后台对磁盘上的文件所做的任何更改都不会反映出来:该函数一直报告第一个(缓存?)读取的值(并且未设置 errno)。

我如何修复上面的代码 没有 fopenfclose 每次?

你不能。 gedit 程序 不会 更改文件。这根本不是它的工作原理。所以你不会看到文件有任何变化。

gedit所做的更改是通过用新文件替换旧文件来完成的。您必须 关闭旧文件并打开新文件才能看到 gedit 所做的更改。