首页 > 解决方案 > 为什么 rewind() 后跟 fscanf() 不反映在磁盘上所做的更改?

问题描述

我反复使用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

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

标签: cfile-iofopenrewind

解决方案


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

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


推荐阅读