На языке D, как я могу считать весь стандартный вход и присвоить его строке (с библиотекой Tango)?
Другой, вероятно, более эффективный способ сбросить содержимое 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
всех входных данных. Скопировано прямо с 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();