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

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

  • 当我按照建议的here setvbuf(file,_IONBUF,0);时,cpecho >所做的更改会得到反映,而gedit所做的更改仍然不会反映。 / li>
  • 当我使用fopenfclose每次循环迭代时,一切都按预期进行。

如何每次 fopenfclose都修复以上代码?

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

不能。 gedit程序不会更改文件。那根本不是它的工作原理。因此,您将看不到文件的任何更改。

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

本文链接:https://www.f2er.com/1247437.html

大家都在问