Next: , Previous: , Up: Formatted Input   [Index]


11.2 書式指定入力関数

ここで述べる関数は,対応するCライブラリの関数と同じような機能を持ちます。標準のscanf関数に対しては,変数を引数リストに並べます。vscanf関数の場合は引数のポインタを与えます。詳細はVariadic Functions in The GNU C Library Reference Manual, もしくは ‘man 3 va_start’を参照して下さい。

書式指定文字列が間違っていたり,引数が正しく対応していなかったりした場合の動作は予測不能です。GCCの書式文字列チェック機能は,GMPの拡張書式指定に対応していないので使用できません。

fmt書式指定文字列と,結果を格納するメモリ領域は重複しないようにして下さい。

Function: int gmp_scanf (const char *fmt, …)
Function: int gmp_vscanf (const char *fmt, va_list ap)

標準入力stdinから読み取りを行います。

Function: int gmp_fscanf (FILE *fp, const char *fmt, …)
Function: int gmp_vfscanf (FILE *fp, const char *fmt, va_list ap)

入力ストリームfpから読み取りを行います。

Function: int gmp_sscanf (const char *s, const char *fmt, …)
Function: int gmp_vsscanf (const char *s, const char *fmt, va_list ap)

NULL終端子付き文字列sから読み取りを行います。

これらの関数の返り値は全て標準C99のscanf関数と同一で,正常に処理して格納できたフィールド数になります。‘%n’フィールドと‘*’で無視されたフィールドは返り値には反映されません。

書式指定のフィールドを処理する前に入力の終了(もしくはファイルエラー)になったり,有効なフィールドがなかったりした時には,0ではなくEOFが返り値になります。書式指定文字列内のホワイトスペース文字はオプション的な扱いになりますので,入っていたからといってEOFを返すわけではありません。先頭部分のホワイトスペースは無視し,書式指定フィールドとしてはカウントしません。

GMPのデータ型に対しては,C99の読み取り規則に則って処理され,一文字先読みされつつ,書式指定通りに読み取りされます。入力数が書式指定と一致していない時には関数が停止され,値が格納されていないフィールドが取り残され,読み取りできた分のみカウントされて返り値に反映されます。例えば,mpf_t型に対しては,入力が‘1.23e-XYZ’だとすると,‘X’まで読み取りされ,それ以降の文字は数字とは異なるので読み取りされません。‘1.23e-’という文字列は,‘e’の後に一桁以上の数字が求められますので,不正な値と判断されます。

標準Cのデータ型に対しては,現在のGMPの実装ではCライブラリのscanf関数が呼び出されますので,有効な入力は少し緩いものになります。

gmp_sscanf関数はgmp_fscanf関数と同一で,読み取りの際に一文字先読みするかどうかの違いだけです。入力データ全体を見ますが,基本的にはgmp_fscanf関数と同一の読み取りを行います。これはC99のsscanf関数がfscanf関数で実装されているのと同じです。