2012-03-19 16 views
-2

ここにはいくつかの情報を含む1つのファイルがあり、タグの値が存在するかどうかをチェックしたいのですが、存在すればこれらの値を取得します。値が存在するかどうかをファイルに確認する

ここでタグの数は固定されており、タグの長さは16以下であり、タグの長さはほぼ10バイト以下の値に固定されます。私はすべての値を確認したい、私はKERNELタグ値をチェックしたいファイルの下から

存在しているかどうか、FSタグ値が存在するかどうか、などなど

:(コロン)の後に存在しているかどうか。

私のファイルには、このようなテキストが含まれています。

KERNEL:2.31 
FS:3.4 
XLOADER:1.1 
UBOOT:2.2 

またはこの

KERNEL:2.31 
FS: 
XLOADER:1.3 
UBOOT: 

ように私は、このコード

#include <stdio.h> 

int main() { 

    FILE *infile = fopen("example.txt", "r"); 

    char buffer[256]; 
    char value[128]; 

    while (fgets(buffer, sizeof(buffer), infile)) 
     if (1 == sscanf(buffer, "KERNEL:%s", value)) { 
      printf("Value = %s\n", value); 
     } 
    return 0; 
} 

を使用していますが、コードの中で、私は別の異なる値に対して、この機能を4回4を呼び出す必要があります。私は、データファイルから行を読んで、私はすべてのタグの値を解析するよりも、この

Value = 2.31 

のように、このコードの出力は

になどKERNEL、FS、のような(手段が存在するかどうかの値を特定したいです)。

だから、これはどのような体は私に示唆することができますこのことを行う良い方法ですか?

+1

「スタック交換では、質問をする人々が質問に力を入れていると主張しています。 (http://www.codinghorror.com/blog/2012/03/rubber-duck-problem-solving.html) – abelenky

答えて

1

ご質問は、ファイルが入っている(または私は答える開始時にしませんでした)何の文脈、それを明確にしません。おそらく、それはアプリケーションが何らかの手段で見つけることができるテキストファイルです。

コンテンツ(タグ)を固定するかどうか、ファイルに他の情報を含めることができるかどうか、空白行が許可されているかどうか、タグがない場合はどうなるかファイル内に予期しないタグがあるとどうなりますか?タグが繰り返されると(バージョンが同じで、バージョンが異なる)何が起こりますか?タグは大文字と小文字を区別しますか?タグの前に空白を入れることができます。バージョンの前に。バージョンの後に?バージョン番号にはどのような文字が使用できますか?これらは重要な細部です。

名前のリストが固定されているとします。タグが7より長くないと仮定しましょう(端末ヌルの場合は8)。バージョン番号が合計で15文字以下であると仮定しましょう(端末ヌルを許可する16文字)。見つけたタグと見つかったバージョンを記録しておく必要があるとします。その場合

、あなたは少し、このようなデータ構造となってしまいます。

typedef struct VersionInfo 
{ 
    char  tag[8]; 
    char  version[16]; 
} VersionInfo; 

static VersionInfo version_data[] = 
{ 
    { "KERNEL", "" }, 
    { "FS",  "" }, 
    { "XLOADER", "" }, 
    { "UBOOT", "" }, 
}; 

明らかに、可能なその基本的な構造では、データファイルから各行を読み取るための関数を書くことができ、コメントや空白行があればそれを破棄してください。これにはおそらくfgets()を使用できます。期待される線は短い。おそらく、長い行について文句を言い、それらを無視するか処理を停止するかを決めるべきです。 version_data配列内の各タグを検索し、見つかったらそれが見つかったかどうかをメモしてから、その行のバージョン情報を見つけてversion_data配列の対応する部分にコピーします。

「期待バージョン」フィールドと実際のバージョンフィールドを使用して構造を拡張することができます。これにより、見つけたバージョンに基づいて何をすべきかを決めることができます。たとえば、プログラムのコンパイル時に既知のものに基づいて、許容バージョンに関連する範囲を持つことができます。 3.0.3でコンパイルされたプログラムを3.0.4以降で実行できるようにするかもしれません。バージョン3.0ではなく、3.0.0以降で作業することもできます。

そのバージョン比較は、それ自体では芸術です。たとえば、バージョン3.0.3,3.1.2,3.6,3.6.1,3.6.1.2、および3.10.0は、おそらくバージョン番号の昇順であるとみなされます。 strcmp()を使用すると、それが達成されません(より先に3.6バージョンが配置されます)。


私はあなたのコード例は、固定文字列でsscanf()使用していることがわかります。これは、おそらくあなたを固定された順序に結びつけ、確かにデータ構造があなたにできるほど柔軟ではありません。 sscanf()を使用して、私のような形式を使用することを期待されている場合:

if (sscanf(buffer, "%7s:%15s", tag, version) != 2) 
    ...something up with the input line... 
...process tag and version that you did find... 

あなたは、文字クラスの表記でスキャンを絞り込むことができます。

if (sscanf(buffer, "%7[A-Z]:%15[0-9.]", tag, version) != 2) 

これだけでは大文字を受け入れますバージョン情報の数字とドットしか受け付けません(バージョン "..0 ... 0 ... 0"にはかなり満足していますが、これはおそらく有効ではありません)。

+0

ここで、どのように構造体にKERNEL値のデータを入力できますか?私の最初の目標は、値が存在するか空白かをチェックしたいということです。空白の場合は、それを残して先に進むよりも、何かをしなければならない。私は受信側でこのファイルを解析します。ここで解析する必要はありません。 – user1089679

+0

私は上記のコードよりも特定のタグの値を取得したいのですが、それはファイルですか? – user1089679

+0

読み取った情報を保持しない場合は、構造にコピーしないでください。確かに、期待されるタグの単純なリストに構造を単純化することができます。あなたはそれらが表示されることを期待する順序でそれらを配置することもできます。可能性は無限大。なぜファイルを読み込み、その値が存在していてもいなくても何らかの形で記録しなければ、存在するかどうかをチェックするのはなぜか分かりません。この検査の動機は現在のところ分かりません(少なくとも、私には分かりません)ので、何をすべきかについて本当に良い答えを与えるのは難しいです。 –

0

はあなたのサンプルを考えると、私が試してみた最初のアプローチは、次のとおりです。

Read a line 
Remove all whitespace 
    If the last character on the line is a colon <do something> 
Else 
    Do something else 
関連する問題