D (Танго) Прочетете целия стандартен вход и го присвоете на низ

На езика D как мога да прочета целия стандартен вход и да го присвоя на низ (с библиотека Tango)?


person Sebtm    schedule 06.03.2010    source източник


Отговори (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
comment
Вместо да вземам отделни редове, как мога да взема всичко в един низ - person Sebtm; 06.03.2010
comment
@sebtm: Свържете ги. (и какво, ако потребителят yourprogram < /dev/urandom? Ще получите безкрайно дълъг низ.) - person kennytm; 06.03.2010
comment
Добре е правилно. Но в моя случай е само cat smalltextfile.txt | myprogram. - person Sebtm; 06.03.2010