5

D言語では、すべての標準入力を読み取って文字列に割り当てる方法(タンゴライブラリを使用)?

4

2 に答える 2

2

http://www.dsource.org/projects/tango/wiki/ChapterIoConsoleから直接コピー:

import tango.text.stream.LineIterator;

foreach (line; new LineIterator!(char)(Cin.stream))
     // do something with each line

1 行だけが必要な場合は、

auto line = Cin.copyln();
于 2010-03-06T18:07:59.660 に答える
1

Stdin の内容をダンプする別の、おそらくより効率的な方法は、次のようなものです。

module dumpstdin;

import tango.io.Console : Cin;
import tango.io.device.Array : Array;
import tango.io.model.IConduit : InputStream;

const BufferInitialSize = 4096u;
const BufferGrowingStep = 4096u;

ubyte[] dumpStream(InputStream ins)
{
    auto buffer = new Array(BufferInitialSize, BufferGrowingStep);
    buffer.copy(ins);
    return cast(ubyte[]) buffer.slice();
}

import tango.io.Stdout : Stdout;

void main()
{
    auto contentsOfStdin
        = cast(char[]) dumpStream(Cin.stream);

    Stdout
        ("Finished reading Stdin.").newline()
        ("Contents of Stdin was:").newline()
        ("<<")(contentsOfStdin)(">>").newline();
}

いくつかのメモ:

  • Array の 2 番目のパラメーターは必須です。省略した場合、Array のサイズは大きくなりません。
  • 4096 を使用したのは、これが一般的にメモリのページのサイズだからです。
  • dumpStreamubyte[]は UTF-8 文字列として定義されているため、 を返しますchar[]。標準入力は必ずしもそうである必要はありません。たとえば、誰かがバイナリ ファイルをプログラムにパイプしたchar[]場合、有効性をチェックすると例外がスローされる可能性のある無効なファイルが作成されます。テキストのみを気にする場合は、結果を a にキャストしてもchar[]問題ありません。
  • copy提供されたすべての入力OutputStreamを排出させるインターフェイスのメソッドです。InputStream
于 2010-03-07T04:27:14.017 に答える