vfscanf() — フォーマット済みデータの読み取り
形式
#include <stdarg.h>
#include <stdio.h>
int vfscanf(FILE *stream, const char *format, va_list arg_ptr);言語レベル
ANSI
スレッド・セーフ
はい
ロケール依存
この関数の振る舞いは、現行ロケールの LC_CTYPE カテゴリーおよび LC_NUMERIC カテゴリーの影響を受ける可能性があります。 また、この振る舞いは、LOCALETYPE(*LOCALEUCS2) または LOCALETYPE(*LOCALEUTF) がコンパイル・コマンドに対して指定されている場合は、現行ロケールの LC_UNI_CTYPE カテゴリーの影響を受ける可能性もあります。 この関数は、コンパイル・コマンドに対して LOCALETYPE(*CLD) が指定されている場合には使用できません。 詳しくは、 CCSID とロケールについてを参照してください。
説明
vfscanf() 関数は、ストリームから引数の可変値で指定されたロケーションへ
データを読み取ります。 vfscanf() 関数は、 fscanf() 関数と同様に機能します。ただし、 arg_ptr は、プログラム内の呼び出しごとに番号が異なる引数のリストを指します。 これらの引数は、呼び出しごとに va_start によって初期化する必要があります。 対照的に、 fscanf() 関数は引数のリストを持つことができますが、そのリスト内の引数の数は、プログラムのコンパイル時に固定されます。
各引数は、format-string の型指定子に対応する型を持つ変数へのポインター
でなければなりません。 format には、
scanf() 関数の書式ストリングと同じ書式および関数があります。
戻り値
vfscanf() 関数は、正常に変換され、割り当てられたフィールドの数を
戻します。 戻り値には、読み取りは行われたが、割り当てられなかったフィールドは含まれません。 変換が行われていない場合に、ファイルの終わりを読み取ろうとすると、戻り値は EOF になります。 戻り値 0 は、フィールドが割り当てられなかったことを
意味します。
例
#include <stdio.h>
#include <stdarg.h>
int vread(FILE *stream, char *fmt, ...)
{
int rc;
va_list arg_ptr;
va_start(arg_ptr, fmt);
rc = vfscanf(stream, fmt, arg_ptr);
va_end(arg_ptr);
return(rc);
}
#define MAX_LEN 80
int main(void)
{
FILE *stream;
long l;
float fp;
char s[MAX_LEN + 1];
char c;
stream = fopen("mylib/myfile", "r");
/* Put in various data. */
vread(stream, "%s", &s[0]);
vread(stream, "%ld", &l);
vread(stream, "%c", &c);
vread(stream, "%f", &fp);
printf("string = %s\n", s);
printf("long double = %ld\n", l);
printf("char = %c\n", c);
printf("float = %f\n", fp);
}
/*************** If myfile contains ************************
**************** abcdefghijklmnopqrstuvwxyz 343.2 ***********
********************** expected output is: *********************
string = abcdefghijklmnopqrstuvwxyz
long double = 343
char = .
float = 2.000000
*/