2016-04-28 11 views
0

fscanfのforループを使用して、ファイルからstructsの配列に5つの列を入力しています。各構造体には、1つの文字列と4つのint、最初のfscanfが文字列名を読み込んで格納します構造体の一部として、他の4つの入力整数を前記構造体(構造体の異なる変数全て)に入れる。通常の入力では正常に動作します。文字が整数列の1つに入力されると、scanfは0とその構造体の残りの値を入れ、charを新しい構造体のように使用します。つまり、その後ろのすべてをスキップし、不要なcharを名前として使用します行の残りの値を入力として使用します。 私の質問は、その入力によって生成された不要な構造体を無視する方法や、単にcharが認識され、特定のscanfがスキップされたことを単に防ぐ方法があるかどうかです。 私はスキャンの代わりにfgetsを使ってみましたが動作しませんでした。また、0を通常の値として入力できるので、不要な値をソートすることはできません。 私は理想的にはコードを見ていることが助けになると理解していますが、これは単色のためのものであり、それらの面会の会議を切望していないので、 ご質問ありがとうございました。 :)C fscanf入力の検証

+0

'fscanf()'関数は、入力の検証に特別に使用するのが本当に難しいです。それは戻り値であることを読んだ。 –

答えて

1

あなたはそれが失敗した場合、それはもちろん

char name[100]; 
int value1; 
int value2; 
int value3; 
int value4; 

if (fscanf(file, "%99s%d%d%d%d", name, &value1, &value2, &value3, &value4) == 5) 
    success(); 
else 
    failure(); 

を失敗した指定子を超えてパラメータを変更していない、それはあなた次第何だ、それが成功したことを確認するためにfscanf()の戻り値をチェックする必要がありsuccess()実際にはfailure()が実行されますが、そのようにして未定義の動作を防止します。

1

キーは、の行を意味する「入力5列」です。 fscanf()を使用すると、と同期するのは難しいです。特に、テキストを別の方法で解釈したい場合は、個別に読み込みと解析を処理するのに最適です。

char buf[100]; 
while (fgets(buf, sizeof buf, istream)) { 
    char s[sizeof buf]; 
    s[0] = 0; 
    int i[4] = { 0,0,0,0 }; // default values 

    // c is the count of scanned variables 
    int c = sscanf(buf, "%s%d%d%d%d", s, &i[0], &i[1], &i[2], &i[3]); 

    printf("%d: %s %d %d %d %d\n", c, s, i[0], i[1], i[2], i[3]); 
} 

「が、文字はscanfのはそのため0を置く整数列の1つに入力されたとき、」そうfalseです。あなたが見ているのは前の値です。

0

短い答えは、fscanfはこの仕事の間違ったツールです。

私は、これはあなたが読みたいファイルの一種である推測している:

だから、
abc 1 2 3 4 
def 5 6 7 8 
ghi 9 10 11 12 

あなたは方法のため、fscanfを使用してこのデータを読み取るための完璧コードを持っていた場合でもfscanf作品、お使いの

abc 1 2 3 4 def 
5 6 7 8 ghi 9 
10 11 12 

テキストの書式設定行を読み込むためのより良い方法は、一度彼らにラインを読むことです:コードも完全に幸せに同じ3つのレコードを作成し、このgarbageyに見えるファイルを読んでいましたfgetsを使用して、各行をそのフィールドに分割します。

私は、私はいつもmain()が受け取る同じように、argcargvで空白で区切られた「言葉」にラインアップを壊すgetargsと呼ばれる機能を使用しています。残念ながらgetargsは標準ではありません。しかし、あなたが使用できるthese class notesに記載されているバージョンがあります。

標準ライブラリ関数strtokを使用して、多かれ少なかれ同じことを行うことができます。 (あいにく私はstrtokを使用しないので、残念ながらそれを行う方法を示すことはできません)

最後に、chuxが既に提案しているように、sscanfを使用できます。あなたはこれを試してみて、それは "うまくいかない"と言ったが、もしあなたが私たちにもっと詳細を教えてくれたら、あなたがそれを働かせるように助けることができるかもしれない。