我反复使用fscanf
and读取以前打开的文件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
- 当我按照这里
setvbuf(file, NULL, _IONBUF, 0);
的建议时,和所做的更改被反映,但仍然没有反映所做的更改。cp
echo >
gedit
- 当我使用
fopen
并且fclose
每次循环迭代时,一切都按预期进行。
如何在没有 fopen
和fclose
每次的情况下修复上述代码?