问题描述
我反复使用fscanf
和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
)。
- 当我按照建议的here
setvbuf(file,_IONBUF,0);
时,cp
和echo >
所做的更改会得到反映,而gedit
所做的更改仍然不会反映。 / li> - 当我使用
fopen
和fclose
每次循环迭代时,一切都按预期进行。
如何每次不 fopen
和fclose
都修复以上代码?
解决方法
不能。 gedit
程序不会不更改文件。那根本不是它的工作原理。因此,您将看不到文件的任何更改。
gedit
所做的更改是通过将旧文件替换为新文件来完成的。您必须关闭旧文件并打开新文件,以查看gedit
所做的更改。