如何解决为什么rewind后跟fscanf不能反映磁盘上所做的更改?
我反复使用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
所做的更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。