【发布时间】:2010-03-06 17:46:29
【问题描述】:
在 D 语言中,我如何读取所有标准输入并将其分配给字符串(使用 Tango 库)?
【问题讨论】:
在 D 语言中,我如何读取所有标准输入并将其分配给字符串(使用 Tango 库)?
【问题讨论】:
直接从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();
【讨论】:
yourprogram < /dev/urandom 怎么办?你会得到一个无限长的字符串。)
cat smalltextfile.txt | myprogram。
另一种可能更有效的转储 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();
}
一些注意事项:
dumpStream 返回 ubyte[],因为 char[] 被定义为 UTF-8 字符串,而 Stdin 不一定需要。例如,如果有人将二进制文件通过管道传输到您的程序,您最终会得到一个无效的char[],如果有任何检查它的有效性,它可能会抛出异常。如果您只关心文本,那么将结果转换为 char[] 就可以了。copy 是 OutputStream 接口上的一个方法,它会导致它耗尽所提供的所有输入的 InputStream。【讨论】: