web-dev-qa-db-ja.com

fscanfの戻り値

Fscanfは、ファイル内のデータを読み取るときに何を返しますか。例えば、

int number1, number2, number3, number4, c;

c = fscanf (spFile, "%d", &number1);
//c will be 1 in this case.

c = fscanf (spFile, "%d %d %d %d", &number1, &number1, &number3, &number4);
//in this case, c will return 4.

引数の数に応じてなぜそのような値が返されるのか知りたいだけです。

8
slow

関数の Xscanfファミリ のマンページから:

正常に完了すると、これらの関数は、正常に一致して割り当てられた入力項目の数を返します;早期のマッチングに失敗した場合、この数はゼロになる可能性があります。最初の一致の失敗または変換の前に入力が終了した場合、EOFが返されます。読み取りエラーが発生した場合、ストリームのエラーインジケータが設定されますEOF =が返され、エラーを示すためにerrnoが設定されます。

したがって、1つの入力項目(&number1)がフォーマット指定子%dと正常に一致したため、fscanfへの最初の呼び出しは1を返します。 fscanfへの2回目の呼び出しは、4つの引数すべてが一致したため、4を返します。

10
Charles Salvia

cplusplus.com から引用します。

成功すると、関数は引数リストの項目の数が正常に入力されたことを返します。このカウントは、予想されるアイテム数と一致する場合もあれば、一致の失敗、読み取りエラー、またはファイルの終わりに達するために少なくなる(ゼロの場合もある)場合があります。

読み取りエラーが発生した場合、または読み取り中にファイルの終わりに達した場合は、適切なインジケーターが設定されます(feofまたはferror)。また、データが正常に読み取られる前にいずれかが発生した場合、EOFが返されます。

-編集-

文字列に読み込まれるバイト数を決定することを意図している場合。

int bytes;
char str[80];
fscanf (stdin, "%s%n",str,&bytes);
printf("Number of bytes read = %d",bytes);
3

これはたまたま非常に単純な質問であり、チャールズによって適切に回答され、私の前で編集されました。しかし、彼らはあなたが次に行き詰まったときにあなたがそのようなものをどこで探すべきかについて言及しませんでした。

最初の質問-fscanfは、入力を読み取り、バイトや適切な入力を読み取ったアイテム(変数アドレス)の数など、読み取られたデータに関する情報を報告することになっているフォーマット済み入力(スキャン)関数のファミリーに属しています割り当てが成功しました。

ここで、fscanfは、関数呼び出しで提供されたフォーマット文字列と入力ファイル内の一致をチェックし、それに応じて(位置の順に)変数-アドレスに値を割り当て、完了すると、の合計カウントを返すことになっています。成功した割り当ての数。したがって、1とnextの結果は4でした(入力が適切に提供されたと仮定)。

第二部:どこを見ればいいですか? -このような機能の詳細については、マニュアルページまたはposix docを参照すると、簡単に見つけることができます。

お気づきの方もいらっしゃると思いますが、前の2つの回答にはmanページからの小さな抜粋も含まれています。

お役に立てれば。

1
nitin

manual ページから:

*これらの関数は、正常に一致および割り当てられた入力アイテムの数を返します。これは、提供されている数より少ない場合もあれば、早期の一致が失敗した場合はゼロになる場合もあります。 *

したがって、1つ目はファイルから1つの整数を読み取ることができる場合は1を返し、2つ目はファイルから4つの整数を読み取ることができる場合は4を返します。

1
Ed Heal

戻り値は、fscanfへの引数の数に依存せず、fscanfによって正常にスキャンされた値の数に依存します。

1
Hitesh Menghani