【问题标题】:D (Tango) Read all standard input and assign it to a stringD (Tango) 读取所有标准输入并将其分配给一个字符串
【发布时间】:2010-03-06 17:46:29
【问题描述】:

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

【问题讨论】:

    标签: string stdin d tango


    【解决方案1】:

    直接从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();
    

    【讨论】:

    • 我如何将所有内容都放在一个字符串中,而不是单独的行
    • @sebtm:连接它们。 (如果用户 yourprogram < /dev/urandom 怎么办?你会得到一个无限长的字符串。)
    • 好的是正确的。但在我的情况下只有cat smalltextfile.txt | myprogram
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多