2011-09-15 33 views
0

我試圖讀取一個文件(特別是/ proc/stat)以從中獲取數據。有很多方法可以在C中執行此操作,但是(目前爲止)我使用fscanf()。 (但是,我並不特別關注它 - 它似乎很適合我想做的事情,如果還有其他更好的方法,請提出建議)。我看到的問題是fscanf()將讀取一行(使用特定的格式字符串),但如果將格式字符串更改爲另一行,則拒絕收集任何數據。例子使這個更清晰。fscanf匹配一行,但不是另一行,類似的行

#include <stdio.h> 
char * 
get_cpu_perc() { 
    unsigned long long cpu0_user=0; 
    FILE* file = fopen("/proc/stat", "r"); 
    int fsf_ret; 
    fsf_ret = fscanf(file, "cpu %llu", &cpu0_user); 
    printf("%llu\n", cpu0_user); 
    printf("%d\n", fsf_ret); 
    return cpu0_user; 
} 
int 
main(){ 
    get_cpu_perc(); 
    return 1; 
} 

上面的工作很好 - 它選擇以'cpu'開頭的第一個數字。我想分裂了這一點,爲每個內核總 - meanining我需要恰克的fscanf()函數調用

fscanf(file, "cpu0 %llu", &cpu0_user); 

但是,我沒有得到該行的任何比賽。這可能是顯而易見的,但是當我談到C時,我非常青睞。(這不是說我不願意學習,而是我並不熟悉如何實現這一點)。

因爲這真的不是一個* nix特定的問題,所以下面是幾行代碼,它們複製了我在運行live/proc/stat時看到的行爲。如果你覺得如此傾向,你可以保存並測試它。

cpu 5885032 59114 1477054 15427556 39113 0 36078 0 0 0 
cpu0 2888239 29861 682033 7814849 22952 0 24266 0 0 0 
cpu1 2996792 29253 795020 7612706 16160 0 11812 0 0 0 

我的問題是:如何獲取fscanf()函數來匹配第二行和第三行,而不僅僅是第一? (這可能與this question有關,但是說實話 - 我甚至沒有做任何如此奇特的東西,也沒有搞亂正則表達式,也許我錯過了什麼?)

+2

順便說一句,你忘了關閉文件。一旦你開始從循環中調用get_cpu_perc(),這最終將導致文件描述符用完。 – wildplasser

回答

0

fscanf()不搜索輸入文本。如果流開頭的文本與格式不匹配,則不返回任何內容。

你可以在這裏使用很多方法。一個可能是使用fgets()來獲得一行,查看前幾個字符以確定它是哪一行,然後使用正確格式的fscanf()。

+0

你的回答不正確。 CG答案中顯示的%說明符顯示跳過字符。 –

4

這應做到:

fscanf(file, "%*s %llu", &cpu0_user)

%*s講述的fscanf讀取一個字符串,但沒有將其分配到任何東西。

+2

順便說一句,從聲明爲返回char *的函數中返回一個無符號長整數long是非常重要的。切勿忽略編譯器的警告。 –

相關問題