std.stdio
std.c.stdio を拡張する標準入出力関数です。 std.stdio を import すると、自動的に std.c.stdio も public に import されます。Authors:
Walter Bright, Andrei Alexandrescu
- I/O エラーが起きたときに発生する例外です
- 先頭の引数 args[0] が FILE* なら、
残りの引数 args[1..$] の要素 arg をそれぞれ、
to!(string)(arg) で変換して、
結果を args[0] に書き込みます。args[0] が FILE* でない場合は、
write(stdout, args) と同じ意味になります。
引数なしでのこの関数の呼び出しはコンパイルエラーになります。 非常にレアなケースとして FILE* を stdout に16進ポインタ値として書き出したいときは、write("", myFilePtr) とすればうまくいきます。
I/O エラーが起きると、StdioException 例外を投げます。
- write(args, '\n') と同じ意味になります。 writeln を引数なしで呼び出すコードは有効で、
単に改行を標準出力に書き込みます。
- 先頭の引数 args[0] が FILE* なら、
args[1] を 書式指定
と解釈して残りの args[2..$] を文字列化し、結果の文字列を args[0] に書き込みます。
arg[0] が FILE* でないときは、
writef(stdout, args) と同じ意味になります。
IMPORTANT:
D 2.006 から動作が変わりました。前のバージョンと違って writef (writefln も同様) は、先頭の文字列に含まれている書式指定のみを解釈します。 この仕様変更の理由は、古い仕様では、 パーセント記号が入る可能性のある文字列変数を単純に表示しようとするのが 無駄に大変になってしまっていたのでこれを避けるためです。
また、2.006 では POSIX の引数指定構文(positional parameter)がサポートされました。
Example:
writef("Date: %2$s %1$s", "October", 5); // "Date: 5 October"
引数指定構文とそうでないスタイルは、同じ書式指定のなかで混ぜて使うことができます。 (POSIX ではこの場合の挙動は未定義です。) 引数位置指定のない引数に対しては、内部のカウンタは、 最後に使用された引数指定の次の引数を指すようになっています。
2.008からの動作: rawフォーマット指定。"%r" を指定すると、writef は引数のバイナリ表現を そのまま出力します。"%-r" は数値をリトルエンディアンで、 "%+r" はビッグエンディアンで、"%r" はプラットフォームの標準のエンディアンで出力します。
- writef(args, '\n') と同じ。
- 互換性のために残されています。代わりに writef を使用してください。
- 互換性のために残されています。代わりに writefln を使用してください。
- ストリーム fp から一行読み込みます。
Returns:
ファイル終端ならば null、それ以外では 行末文字 terminator を含めて1行 fp から読み込んで返します。
Params:
Throws:
エラー時に StdioException
Example:
stdin を読んで stdout に書き込みます。import std.stdio; int main() { char[] buf; while ((buf = readln()) != null) write(buf); return 0; }
- ストリーム fp から行末文字 terminator 込みで1行読み込み、buf[] に格納します。
これはバッファを再利用できるため readln(FILE*) よりも早くなることが多いです。ただし、バッファを再利用すると言うことは、 前の結果が必要なケースではコピーを取っておく必要があることを意味しています。
Params:
Returns:
ファイル終端では 0、そうでなければ 読み込まれた文字数
Throws:
エラー時に StdioException
Example:
stdin を読んで stdout に書き込みます。import std.stdio; int main() { char[] buf; while (readln(stdin, buf)) write(buf); return 0; }
この方法は、可能ならば readln(stdin, buf) が buf に割り当てられたメモリを再利用するため、毎行 buf = readln() で新しくメモリを割り当てる前の例よりも効率的です。
- C形式の文字列に変換してから std.c.stdio.fopen
を呼び出す便利関数です
- foreach によって、ファイルを行ごとに分割して読み込みます。
Example:
void main() { foreach (string line; lines(stdin)) { ... use line ... } }
行区切り文字 (デフォルトは '\n') も文字列に含まれます (ファイルの最後の行が 改行を含んでいない場合をのぞく)。 line として使える型はいくつかあり、それぞれで lines の動作は以下のように変わります:
- line の型が string、 wstring、dstring の場合、指定された型の文字列が 毎回割り当てられます。
- line の型が char[]、wchar[]、dchar[] の場合、line の内容は 読み込み毎に再利用 (上書き) されます。
- line の型が invariant(ubyte)[] の場合、動作は場合 (1) と似ていますが、 入力に対するUTFのチェックが行われなくなります。
- line の型が ubyte[] の倍、動作は場合 (2) と似ていますが、 入力に対するUTFのチェックが行われなくなります。
どの場合も、2変数バージョンを使うことも可能です。 その場合、一つめの変数(整数型。ulong や uint など) がゼロオリジンの行番号を表します。
Example:
foreach (ulong i, string line; lines(stdin)) { ... use line ... }
I/Oエラー時には StdioException が投げられます。
- foreach によって、ファイルをチャンクに分割して読み込みます。
Example:
void main() { foreach (ubyte[] buffer; chunks(stdin, 4096)) { ... use buffer ... } }
buffer の中身は呼び出しのたびに再利用されます。 上の例では、最後の1回を除き buffer.length は常に4096です。 最後の1回は buffer.length は4096より小さい可能性があります。 (ただし常に0よりは大きいです)
I/Oエラー時には StdioException が投げられます。
