Search code examples
stringstdindtango

D (Tango) Read all standard input and assign it to a string


In the D language how I can read all standard input and assign it to a string (with Tango library) ?


Solution

  • Another, probably more efficient way, of dumping the contents of Stdin would be something like this:

    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();
    }
    

    Some notes:

    • The second parameter to Array is necessary; if you omit it, Array will not grow in size.
    • I used 4096 since that's generally the size of a page of memory.
    • dumpStream returns a ubyte[] because char[] is defined as a UTF-8 string, which Stdin doesn't necessarily need to be. For example, if someone piped a binary file to your program, you would end up with an invalid char[] that could throw an exception if anything checks it for validity. If you only care about text, then casting the result to a char[] is fine.
    • copy is a method on the OutputStream interface that causes it to drain the provided InputStream of all input.