D(Tango)读取所有标准输入并将其分配给字符串

时间:2010-03-06 17:46:29

标签: string stdin d tango

在D语言中,我如何读取所有标准输入并将其分配给字符串(使用Tango库)?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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的大小不会增大。
  • 我使用了4096,因为它通常是一页内存的大小。
  • dumpStream返回ubyte[],因为char[]被定义为UTF-8字符串,Stdin不一定需要。例如,如果有人将二进制文件传送到您的程序,您最终会得到一个无效的char[],如果有任何检查它的有效性,可能会抛出异常。如果您只关心文本,那么将结果转换为char[]就可以了。
  • copyOutputStream接口上的一种方法,导致它耗尽所有输入的InputStream