2012-11-04 19 views
12

設定ファイルから設定行を読み込むfscanfがあります。これらの設定はfscanfと改行文字

name1=option1; 
name2=option2; 
... 

のように見える厳密に定義済みの形式を持っているので、基本的に私は、コンフィギュレーションファイルストリームと名前とオプションである

fscanf(configuration,"%[^=]=%[^;];",name,option); 

はプログラミングのバッファですか。

名前バッファには、私が望ましくない改行文字が含まれているという問題があります。 "[^ ...]"で改行文字をスキップするように設定されているフォーマット指定子はありますか?とにかく、これまでフォーマット指定子で解決できますか?

ところで:この

"%[^=]=%[^;];\n" 

を足すことで改行文字を飲み込むことは、私は改行文字が一度どこでもより多く繰り返すことができることを考えるためにelegentではありません。

+1

'nameN'フィールドに空白を含めることができない場合は、フォーマット文字列の前に空白を追加してください。'%[^ =] =%[^;]; '' - 先頭の空白をスキップします。可能であれば、 'getchar()'で改行を単独で使う必要があります。 –

+1

とにかく、改行の繰り返しについては、 '%* [\ n]'を使用してそれらを保存せずに任意の数の「\ n」を読むことができます。 – effeffe

答えて

11

ちょうどフォーマット文字列の末尾にスペースを追加します。

"%[^=]=%[^;]; " 

これは、新しいラインを含め、すべての空白文字を食べるようになります。 cplusplus.comから

引用:

空白文字:読み、次の非空白文字の前に発生したすべての空白文字を無視します関数は(空白文字は、スペース、改行やタブ文字を含める - isspaceを参照してください)。フォーマット文字列内の単一の空白は、ストリームから抽出された空白文字の数(noneを含む)を検証します。

+0

それは素晴らしいです。ありがとう。 – Yang

1

これは動作します:

fscanf(configuration,"%[^=]=%[^;];%[^\n]",name,option,dummy);

を新しい行character.Otherwiseを消費する必要があります、改行を入力ストリームに残されています。

+0

うーん...ダミーはどのくらい大きいの?可能なすべての改行文字を呑み込むのに十分な大きさですか? – Yang

+0

入力データの厳密な事前定義されたフォーマットがあると言ったので、ダミー変数を作成します。これは、入力フォーマットからの可能性のある偏差を見つけ出すのに役立ちます(fscanfやfgetsの前または後にスペースを使用すると起こります)。 – askmish

+1

'%[^ =] =%[^;];%* [^ \ n]'を使って、それらの改行とそれを含むバッファを忘れるのはなぜですか? – effeffe

6

代わりにfgets()を使用して、行全体を文字列に読み込み、sscanf()を使用します。これは、関数がどのデータを処理しているかを正確に見ることができるという点で、デバッグに利点があります。