2012-03-21 20 views
2
私はCプログラムで、特定のキーワードマッチングのためのファイルを解析しています

を失うことなく、ファイルの構文解析は、 はここに私のサンプルコードです...C:空白

#include <stdio.h> 

int main() { 

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

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

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

Somefile.txt

some junk 
#a comment 
a = 1 ; a couple other variables. 
b = 2 
x = 3 
x = 4 
x=5 
x = Hi hello 

出力:

Value = 3 
Value = 4 
Value = 5 
Value = Hi 

問題:xに「こんにちは」のような値が含まれている場合は、「Hi」のみを解析するだけですスペースを奪わずにxの値全体を解析したい

解決策を教えてください。

ありがとうございました。あなたのコード行で

+0

標準Cには、本当に目的の機能はありません。しかし、ほとんどのコンパイラベンダーは、あなたが望むことを*行う*機能を提供しています。別の方法として、ファイルを読み込んで、形式解析を自分で行います。 –

+0

http://stackoverflow.com/questions/6853789/how-do-i-scan-spaces-into-a-a-strings – vrdhn

答えて

2

if (1 == sscanf(buffer, " x = %s", value)) 

%sは一言で読むことを意味します。

あなたは、行の残りの部分に読まこのような%[^\n]sを使用する場合:

if (1 == sscanf(buffer, " x = %[^\n]s", value)) 
+0

ええ、ええ、それは 'x ='の行に一致するだけです。 –

+0

うん、それは@nimitがすでに持っていたコードと同じで、彼がそれを持っていた唯一の問題は、それが行全体を読まなかったということでした。これで修正されます。 – lnafziger

+0

そして、もし問題を読んで(そして与えられた例を)読めば、彼はx行だけを望んでいます。 – lnafziger

0

まず最初に行うには、バックオフsscanf関数です。マニュアルページを読むと、scanfは "ここに白いスペースがあり、重要ではない"と言うスペックとしてスペースを扱います。それ以外の文字は、リテラルの仕様です。結果として、そのフォーマット仕様は、「スペースの間、次にx、次に空白、次に '='、そしてより多くの空白、そして文字列を返すようなものです」

あなたが実際にやっていることは、軽量の解析です。おそらく、各行を読み、簡単な有限状態マシン、すなわち

while not end of file 
    while not end of line 
     get next character 
     if char == ";" -- comment 
     break 
     if char is a letter 
     parse an assignment 

などでスキャンするほうがよいでしょう。

+0

xの値を解析したいだけです。 – Nimit