14.2.11 フォーマットされた入力
Octave は、フォーマットされた入力を読み込むためにscanf、、、fscanfおよびsscanf 関数を提供します。これらの関数にはそれぞれ 2 つの形式があります。1 つはファイルからデータのベクトルを抽出するために使用でき、もう 1 つはより「C に似た」ものです。
: [val, count, errmsg] = fscanf (fid, template, size)
: [v1, v2, …, count, errmsg] = fscanf (fid, template, "C")
最初の形式では、templateに従ってfidから読み取り、結果を行列valに返します。
オプション引数sizeは、読み取るデータの量を指定します。
Inf
可能な限り読み取り、列ベクトルを返します。
nr
最大nr個の要素を読み取り、列ベクトルを返します。
[nr, Inf]
可能な限り読み取り、nr行の行列を返します。読み取られた要素の数がnrの正確な倍数でない場合は、最後の列にゼロが埋め込まれます。
[nr, nc]
要素まで読み取り、 nr行の行列を返します 。読み取られた要素数がnrの正確な倍数でない場合は、最後の列にゼロが埋め込まれます。 nr * nc
サイズが省略された場合は、 の値Infが想定されます。
テンプレートが文字変換のみを指定する 場合、文字列が返されます。
正常に読み取られた項目の数はcountに返されます。
エラーが発生した場合、errmsgにはシステム依存のエラー メッセージが含まれます。
2番目の形式では、テンプレートに従ってfidから読み取り、テンプレート内の各変換指定子は単一のスカラー戻り値に対応します。この形式はより「Cに似ており」、Octaveの以前のバージョンとも互換性があります。成功した変換の数はcountに返されます。
テンプレート文字列の構文の完全な説明については、GNU Octave マニュアルの「フォーマットされた入力」セクションを参照してください。
参照: fgets、fgetl、fread、scanf、sscanf、fopen。
: [val, count, errmsg] = scanf (template, size)
: [v1, v2, …, count, errmsg] = scanf (template, "C")
これは、 fid =fscanfで呼び出すことと同じです。 stdin
現時点では、対話型プログラムを呼び出すことは有用ではありませんscanf。
参照: fscanf、sscanf、printf。
: [val, count, errmsg, pos] = sscanf (string, template, size)
: [v1, v2, …, count, errmsg] = sscanf (string, template, "C")
これは に似ていますがfscanf、文字がストリームからではなく 文字列stringから取得される点が異なります。
文字列の末尾に到達すると、ファイル終了条件として扱われます。 によって返される値に加えてfscanf、読み取られる次の文字のインデックスがposに返されます。
参照: fscanf、scanf、sprintf。
の呼び出しは、任意の引数がテンプレート文字列の制御下で読み取られるという点で、scanf表面的には の呼び出しに似ています 。 テンプレートの変換指定の構文は のものと非常に似ていますが、テンプレートの解釈は、固定フィールドのフォーマットではなく、自由形式の入力と単純なパターン マッチングに向けられています。 たとえば、ほとんどの変換では、入力ファイル内の「空白文字」(スペース、タブ、改行を含む) がスキップされ、数値入力変換には、対応する出力変換にあるような精度の概念はありません。 通常、テンプレート内の空白以外の文字は、入力ストリーム内の文字と完全に一致することが期待されます。 たとえば、printfprintfscanfsscanfは、 数値と文字列が混在する出力タイプを使用する場合、文字列と空白を異なる方法で解析することに注意してください。
teststr = "1 is a lonely number";
sscanf (teststr, "%s is a %s")
⇒ 1lonelynumber
sscanf (teststr, "%g is a %s")
⇒
1
108
111
110
101
108
121
[a, b, c] = sscanf ("1 is a lonely number", "%g is a %s %s", "C")
⇒ a = 1
⇒ b = lonely
⇒ c = number
一致の失敗が発生すると、scanfすぐに戻り、最初の一致しない文字をストリームから読み取られる次の文字として残し、scanf正常に変換されたすべての項目を返します。
フォーマットされた入力関数は、フォーマットされた出力関数ほど頻繁には使用されません。その理由の 1 つは、適切に使用するには注意が必要であるためです。もう 1 つの理由は、一致エラーからの回復が難しいことです。
テンプレート文字列で許可される特定のフラグと修飾子、およびそれらの解釈については、次のセクションで詳しく説明します。