首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C語言文件讀寫:解決rewind與break導致的數據停滯問題

     編輯:程式設計綜合問答

問題背景

在編寫一個每秒讀取網卡 eth0 流量的小程序時,發現加入 break 語句後,輸出只有第二次發生變化,隨後數據不再更新。代碼片段如下:

while(1){
    while(fgets(buf, MAXLINE, fp) != NULL){
        if(strncmp(buf, dev, 6)==0){
            printf("%s\n", buf);
            break;
        }
    }
    rewind(fp);
    sleep(1);
}

問題分析

當 break 跳出內層循環時,文件指針停留在匹配行的末尾。隨後調用 rewind(fp) 將指針移回文件開頭,但標準 I/O 庫的緩衝區中仍殘留上次讀取未處理的數據。下一次 fgets 會優先消耗緩衝區內容,而不會重新從磁盤讀取,導致讀到的仍是舊數據。

解決方案

將 break 替換為 fseek(fp, -1L, SEEK_END)(或根據具體邏輯調整偏移量),使文件指針定位到文件末尾,強制下一次循環重新填充緩衝區,從而讀取最新的 /proc/net/dev 內容。

關鍵點總結

  • break 僅跳出循環,不會刷新或重置文件流緩衝區。
  • rewind 僅移動文件指針,不清空用戶態緩衝區。
  • 使用 fseek 定位到文件末尾可觸發緩衝區失效,迫使下次讀取獲取最新數據。

修正後程序可穩定每秒輸出最新網卡流量統計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved