2011-09-15 3 views
0

ファイル(特に/ proc/stat)を読み込んでデータを取得しようとしています。 Cでこれを行う方法はたくさんありますが、(これまでのところ)私はfscanf()を使っています。 (しかし、私は特にそれに縛られていません - それはちょうど私がやりたいことに適しているようですが、他に良い方法があればそれを提案してください)。私が見ている問題は、fscanf()が1行(特定のフォーマット文字列)を読み込みますが、別の行をターゲットにするようにフォーマット文字列を変更するとデータを収集することを拒否することです。例は、これをはるかに明確にします。fscanfは1行にマッチしますが、別の行には似ていません

#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」で始まる行の最初の番号を選択する。私はコアごとの合計にこれを分割したい - 私は関数fscanfをチャゲする必要がmeanining()しかし、私はそのライン上の任意の一致を得ることはありません

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 

私の質問はこれです:どのように私は最初の2行目と3行目照合していないために)(関数fscanfを得るのですか? (これは恐らくthis questionに関連しているかもしれませんが、正直なところ - 私は何もしていないし、正規表現を使っていないかもしれません)。

+2

あなたはファイルをfcloseすることを忘れています。これは、ループからget_cpu_perc()を呼び出すと、最終的にはファイル記述子の不足につながります。 – wildplasser

答えて

0

fscanf()は入力テキストを検索しません。ストリームの先頭のテキストがフォーマットと一致しない場合、何も返されません。

ここではさまざまな方法があります。 fgets()を使用して行を取得し、最初の数文字を調べてどの行にあるかを確認し、fscanf()を適切な形式で使用することがあります。

+0

あなたの答えは正しくありません。 CGの答えに表示される%指定子は、文字をスキップして表示します。 –

4

これはそれを行う必要があります。

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

%*s文字列を読んで何でもにそれを割り当てないために関数fscanfを伝えます。

+2

そして、返されるchar *として宣言された関数からunsigned long longを返すことは、一番上です。コンパイラからの警告は無視しないでください。 –

関連する問題