0

我反复使用fscanfand读取以前打开的文件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 >cperrno

  • 当我按照这里setvbuf(file, NULL, _IONBUF, 0);的建议时,和所做的更改被反映,但仍然没有反映所做的更改。cpecho >gedit
  • 当我使用fopen并且fclose每次循环迭代时,一切都按预期进行。

如何在没有 fopenfclose每次的情况下修复上述代码?

4

1 回答 1

3

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

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

于 2020-11-09T18:27:26.603 回答