2010-03-06 8 views

ответ

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(); 
+0

Вместо того, чтобы брать отдельные строки, как я могу взять все в одной строке – Sebtm

+0

@sebtm: объединить их. (а что, если пользователь 'yourprogram kennytm

+0

Хорошо. Но в моем случае это только 'cat smalltextfile.txt | myprogram'. – Sebtm

 Смежные вопросы

  • Нет связанных вопросов^_^