На езика D как мога да прочета целия стандартен вход и да го присвоя на низ (с библиотека Tango)?
D (Танго) Прочетете целия стандартен вход и го присвоете на низ
Отговори (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 е необходим; ако го пропуснете, масивът няма да се увеличи по размер.
- Използвах 4096, тъй като обикновено това е размерът на страница от паметта.
dumpStream
връщаubyte[]
, защотоchar[]
е дефиниран като UTF-8 низ, което Stdin не е задължително да бъде. Например, ако някой изпрати двоичен файл към вашата програма, ще получите невалиденchar[]
, който може да хвърли изключение, ако нещо го проверява за валидност. Ако се интересувате само от текст, тогава прехвърлянето на резултата къмchar[]
е добре.copy
е метод на интерфейсаOutputStream
, който го кара да източва предоставенитеInputStream
от целия вход.
person
DK.
schedule
07.03.2010
Копирано направо от 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();
person
kennytm
schedule
06.03.2010
Вместо да вземам отделни редове, как мога да взема всичко в един низ
- person Sebtm; 06.03.2010
@sebtm: Свържете ги. (и какво, ако потребителят
yourprogram < /dev/urandom
? Ще получите безкрайно дълъг низ.)
- person kennytm; 06.03.2010
Добре е правилно. Но в моя случай е само
cat smalltextfile.txt | myprogram
.
- person Sebtm; 06.03.2010