为什么我需要重新打开文件才能获取最新数据?

时间:2016-03-07 08:51:07

标签: c linux

以下是获取有关网络设备的系统信息的代码:

 FILE* f = fopen(filePath, "r");
 if(f == NULL)
 {
     perror("Error while open the file:");
     return -1;
 }
while(1)
{
    fseek(f, 0, SEEK_SET);
    char s[20];
    fgets(s, 20, f);
    int len = strlen(s);
    s[len] = '\0';
    printf(" %20s\r", s);
    fflush(stdout);
    sleep(2);
}

但输出保持不变,比我决定重新打开文件 每次我需要阅读它:

while(1)
{
    FILE* f = fopen(filePath, "r");
    if(f == NULL)
    {
        perror("Error while open the file:");
        return -1;
    }
    char s[20];
    fgets(s, 20, f);
    int len = strlen(s);
    s[len] = '\0';
    char output[50];
    printf(" %20s\r", s);
    fflush(stdout);
    sleep(2);
}
and everything worked just fine, but I don't know why?

2 个答案:

答案 0 :(得分:3)

您需要刷新流。在fseek之前添加以下内容。

fflush(f);
fseek(f, 0, SEEK_SET);

添加fflush(f)后,它会显示更新的内容。

工作示例:

#include<stdio.h>

int main()
{
 FILE* f = fopen("/tmp/testfile", "r");
 if(f == NULL)
 {
     perror("Error while open the file:");
     return -1;
 }
 while(1)
 {
    fflush(f);
    fseek(f, 0, SEEK_SET);
    char s[20];
    fgets(s, 20, f);
    int len = strlen(s);
    s[len] = '\0';
    printf(" %20s\r", s);
    fflush(stdout);
    sleep(2);
 }
 return 0;
}

继续修改文件并保存并观察示例程序的输出。

http://man7.org/linux/man-pages/man3/fflush.3.html

对于与可搜索文件相关的输入流(例如,磁盘文件,        但不是管道或终端),fflush()丢弃任何缓冲的数据        已从基础文件中获取,但尚未使用        通过申请。

如果要在其他操作系统上刷新流,请检查相关操作系统的手册页。

答案 1 :(得分:0)

在第3行,你有以下的coode。 FILE * f = fopen(filePath,“r”);

因为它在while(1)循环内。 当每次被调用时。 你得到的最新文件。

如果一个f只被分配一次,那么