2016-03-07 38 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

相關問題