std::scanf, std::fscanf, std::sscanf
ヘッダ <cstdio> で定義
|
||
int scanf( const char* format, ... ); |
(1) | |
int fscanf( std::FILE* stream, const char* format, ... ); |
(2) | |
int sscanf( const char* buffer, const char* format, ... ); |
(3) | |
様々なソースからデータを読み込み、それを format
に従って解釈し、結果を指定された位置に格納します。
stream
からデータを読み込みます。buffer
からデータを読み込みます。目次 |
[編集] 引数
stream | - | 読み込む入力ファイルストリーム | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
buffer | - | 読み込むヌル終端文字列を指すポインタ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
format | - | 入力の読み込み方法を指定するヌル終端文字列を指すポインタ。
書式文字列は以下から構成されます。
以下の書式指定子が利用できます。
長さ指定子 変換指定子 固定幅の整数型に対する正しい変換指定は、ヘッダ <cinttypes> で定義されています (SCNdMAX, SCNuMAX などは 変換指定子それぞれの動作後に副作用完了点があります。 これにより同じ「ゴミ箱」変数に複数のフィールドを格納することができます。 数字のない指数で終わる不完全な浮動小数点値をパースするとき、例えば変換指定子 %f で "100er" をパースするとき、シーケンス "100e" (有効な浮動小数点数の可能性がある最も長い接頭辞) が消費され、結果はマッチエラーとなり (消費したシーケンスは浮動小数点数に変換できません)、 "r" が残されます。 処理系によってはこのルールに従わず、ロールバックして "100" のみを消費し、 "er" を残します (glibc bug 1765)。
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
... | - | 受け取り引数 |
[編集] 戻り値
代入に成功した受け取り引数の数 (最初の受け取り引数が代入される前にマッチの失敗が発生した場合はゼロになることがあります)、または最初の受け取り引数が代入される前に入力の失敗が発生した場合は EOF。
[編集] ノート
ほとんどの変換指定子は、まずすべての連続するホワイトスペースを消費します。 以下のようなコードは
std::scanf("%d", &a); std::scanf("%d", &b);
別の行に入力された2つの整数 (この場合、2番目の %d は1番目の %d によって残された改行を消費します)、または同じ行の空白またはタブで区切られた2つの整数 (この場合、2番目の %d は空白またはタブを消費します) を読み込みます。
%c などの先行するホワイトスペースを消費しない変換指定子は、書式文字列内でホワイトスペース文字を使用することでホワイトスペースを消費するようにできます。
std::scanf("%d", &a); std::scanf(" %c", &c); // ignore the endline after %d, then read a char
[編集] 例
#include <iostream> #include <clocale> #include <cstdio> int main() { int i, j; float x, y; char str1[10], str2[4]; wchar_t warr[2]; std::setlocale(LC_ALL, "en_US.utf8"); char input[] = u8"25 54.32E-1 Thompson 56789 0123 56ß水"; // parse as follows: // %d: an integer // %f: a floating-point value // %9s: a string of at most 9 non-whitespace characters // %2d: two-digit integer (digits 5 and 6) // %f: a floating-point value (digits 7, 8, 9) // %*d an integer which isn't stored anywhere // ' ': all consecutive whitespace // %3[0-9]: a string of at most 3 digits (digits 5 and 6) // %2lc: two wide characters, using multibyte to wide conversion int ret = std::sscanf(input, "%d%f%9s%2d%f%*d %3[0-9]%2lc", &i, &x, str1, &j, &y, str2, warr); std::cout << "Converted " << ret << " fields:\n" << "i = " << i << "\nx = " << x << '\n' << "str1 = " << str1 << "\nj = " << j << '\n' << "y = " << y << "\nstr2 = " << str2 << '\n' << std::hex << "warr[0] = U+" << warr[0] << " warr[1] = U+" << warr[1] << '\n'; }
出力:
Converted 7 fields: i = 25 x = 5.432 str1 = Thompson j = 56 y = 789 str2 = 56 warr[0] = U+df warr[1] = U+6c34
[編集] 関連項目
(C++11)(C++11)(C++11) |
可変個引数リストを使用して stdin、ファイルストリームまたはバッファから書式付き入力を行います (関数) |
ファイルストリームから文字列を取得します (関数) | |
(C++11) |
stdout、ファイルストリームまたはバッファに書式付き出力を行います (関数) |
(C++17) |
文字シーケンスを整数値または浮動小数点値に変換します (関数) |
scanf, fscanf, sscanf の C言語リファレンス
|