2016-03-07 37 views
0

这里是我的代码,以获取有关网络设备的系统信息:为什么我需要重新打开文件才能获得最新的数据?

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? 
+0

你应该关闭你打开的任何东西。 – MikeCAT

+0

谢谢。但我的观点是,是否可以每次打开一个文件并从头读取以获取其最新数据?从我粘贴的第一个代码示例看来,即使文件已更新,数据仍然保持不变。 – hustxujinkang

+1

你正在阅读什么文件?它是基于磁盘的文件还是伪文件系统中的某个文件? – subin

回答

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(相关联的输入流)忽略任何缓冲数据 已经从底层文件取出的,但还没有被应用程序消耗了 。

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

+0

在第一个代码示例中,我已经完成了它。但它仍然无法获得更新 – hustxujinkang

+0

我想添加fflush(f);在fseek之前。我在添加fflush(f)后进行了测试,看起来没问题。 –

+0

什么操作系统?在输入流上调用'fflush()'是未定义的行为。 Per ** 7.21.5.2 [C标准]的功能**(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570。PDF):*如果 'stream' 点到输出流或其中最近 操作未输入的更新流,所述 'fflush' 函数导致该流 任何未写入的数据将被递送到主机环境写入文件;否则,行为是 未定义。*这里的流是一个* input *流,因此在其上调用'fflush'是未定义的。 –

0

在行号3中,您有以下代码。 FILE * f = fopen(filePath,“r”);

由于它在while(1)循环中。 每当它被调用时。 您正在获取的最新文件。

在哪里只有一个f被分配一次。

+0

你基本上只是重申OP在他们的问题中所说的话,没有给出任何解释*为什么会发生这种情况。 – duskwuff

相关问题