2017-12-14 19 views
1

次のファイルをtxtファイルでスキャンするにはどうすればよいですか?例えば区切り文字「_」を含む入力fscanfを読み取る

number_name_name1_number2 

12_whoever_alternative with spaces_31 

私が試してみた:すべての

fscanf(f, "%d %[^_]_ %s %[^_]_ %s %[^_]_ %d", &number, name, name1, &number2) 
+0

あなたは7つの値を読み込もうとしていますが、4つの変数しかリストしていません...? –

+0

"_"デリミタを無視したい –

+0

データの一部を表示してください。スキーマの概要を説明しましたが、実際のデータは表示されませんでした。 –

答えて

1

あなたはこのためfscanf()を使用しなければならない場合、この形式はそれを行う必要があります。

fscanf(f, "%d_%[^_]_%[^_]_%d", &number, name, name1, &number2); 

区切り文字は、単一のアンダースコアであり、それが空であること2つの文字列を対応していないことを前提としています。 は、各数字の前にある空白を受け入れます(これは無視されます).2つの文字列は、複数の文字を含むことができます。これらの潜在的な問題はどちらも対処できますが、数字の前に空白文字を拒否すると、%dではなく%[ディレクティブを使用して文字列にスキャンする必要があります。

全体的に、これはおそらくそれが価値よりもずっと面倒です。最も簡単な書式を扱うために関数scanf()に依存するよりも、独自の構文解析関数を書く方が良い場合がよくあります。

+0

ありがとう、それは動作します –

2

まず、コードが現在立っているとして、あなたはC11を引用undefined behavior

を持って、章§7.21.6.2

フォーマットの引数が不十分な場合、 の動作は未定義です。

私たちは、あなたのケースでは、

fscanf(f, "%d %[^_]_ %s %[^_]_ %s %[^_]_ %d", &number, name, name1, &number2) 
     |=================================| |=============================| 
       7 conversion specifiers    only 4 arguments!!! 
       in the format sting 

[]ペアが実際に変換指定子を形成し、それらが保存するスキャンした結果のために対応する引数を必要とし、覚えておいてください見ての通り。

提案:

あなたは個々のトークンを取得するために入力をトークン化するために、データとstrtok()を読むためにfgets()を使用したい場合があり、と述べました。

fscanf(f, "%d %[^_]_ %s %[^_]_ %s %[^_]_ %d", &number, name, name1, &number2) 

は、その後、スペースが続く番号、アンダースコアを含まない文字の後、一連の、下線とスペース等...だから何のような全く何も一致している:あなたが現在持っているもの

1

あなたは実際に期待しています。さらに、それぞれ%...には、対応する変数に値が格納されることが期待されます。

希望するものを得るには、次のようにします。

戻り値を確認することを忘れないでください.4未満の値は、4つの値すべてを検出しなかったことを意味します。

関連する問題