На языке D, как я могу читать весь стандартный ввод и назначать его строке (с библиотекой Tango)?D (Tango) Прочитайте весь стандартный ввод и присвойте его строке
5
A
ответ
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();
}
Некоторые примечания:
- Необходим второй параметр для массива; если вы его опустите, массив не будет расти в размерах.
- Я использовал 4096, поскольку это, как правило, размер страницы памяти.
dumpStream
возвращаетubyte[]
, потому чтоchar[]
определен как строка UTF-8, которой не обязательно должен быть Stdin. Например, если кто-то подключил двоичный файл к вашей программе, вы получите недопустимыйchar[]
, который может генерировать исключение, если что-либо проверяет его на достоверность. Если вы только заботитесь о тексте, то отличное от результата результат получаетсяchar[]
.copy
- это метод на интерфейсеOutputStream
, который заставляет его сливать предоставленныйInputStream
всех входных данных.
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
Если требуется только одна линия, используйте
auto line = Cin.copyln();
Вместо того, чтобы брать отдельные строки, как я могу взять все в одной строке – Sebtm
@sebtm: объединить их. (а что, если пользователь 'yourprogram dev/urandom'? Вы получите бесконечно длинную строку.) – kennytm
Хорошо. Но в моем случае это только 'cat smalltextfile.txt | myprogram'. – Sebtm