Выбрать главу

}

}

Если выполнить эту программу из командной строки Test > log

то символьная строка "Это тест." будет выведена в файл log. Аналогичным образом переадресуется ввод. Но для переадресации ввода указываемый источник входных данных должен удовлетворять требованиям программы, иначе она "зависнет".

Операторы < и >, выполняющие переадресацию из командной строки, не являются составной частью С#, а предоставляются операционной системой. Поэтому если в рабочей среде поддерживается переадресация ввода-вывода, как, например, в Windows, то стандартные потоки ввода и вывода можно переадресовать, не внося никаких изменений в программу. Тем не менее существует другой способ, позволяющий осуществлять переадресацию стандартных потоков под управлением самой программы. Для этого служат приведенные ниже методы Setln (), SetOut () и SetError (), являющиеся членами класса Console.

static void Setln(TextReader новый_поток_ввода) static void SetOut(TextWriter новый_поток_вывода)

static void SetError(TextWriter новый_поток_сообщений_об_ошибках)

Таким образом, для переадресации ввода вызывается метод Setln () с указанием требуемого потока. С этой целью может быть использован любой поток ввода, при условии, что он является производным от класса TextReader. А для переадресации вывода вызывается метод SetOut () с указанием требуемого потока вывода, который должен быть также производным от класса TextReader. Так, для переадресации вывода в файл достаточно указать объект класса FileStream, заключенный в оболочку класса StreamWriter. Соответствующий пример программы приведен ниже.

// Переадресовать поток Console.Out.

using System; using System.10;

class Redirect {

static void Main() {

StreamWriter log_out = null;

try {

log_out = new StreamWriter("logfile.txt");

// Переадресовать стандартный вывод в файл logfile.txt.

Console.SetOut(log_out);

Console.WriteLine("Это начало файла журнала регистрации.");

for(int i=0; i<10; i++) Console.WriteLine(i);

Console.WriteLine("Это конец файла журнала регистрации.");

} catch(IOException exc) {

Console.WriteLine("Ошибка ввода-вывода\п" + exc.Message);

} finally {

if(log_out != null) log_out.Close();

}

}

}

При выполнении этой программы на экран ничего не выводится, но файл logfile. txt будет содержать следующее.

Это начало файла журнала регистрации.

0

1

2

3

4

5

6

7

8

9

Это конец файла журнала регистрации.

Попробуйте сами поупражняться в переадресации других встроенных потоков.

Чтение и запись двоичных данных

В приведенных ранее примерах демонстрировались возможности чтения и записи байтов или символов. Но ведь имеется также возможность (и ею пользуются часто) читать и записывать другие типы данных. Например, можно создать файл, содержащий данные типа int, double или short. Для чтения и записи двоичных значений встроенных в C# типов данных служат классы потоков BinaryReader nBinaryWriter. Используя эти потоки, следует иметь в виду, что данные считываются и записываются во внутреннем двоичном формате, а не в удобочитаемой текстовой форме.

Класс BinaryWri ter

Класс BinaryWriter служит оболочкой, в которую заключается байтовый поток, управляющий выводом двоичных данных. Ниже приведен наиболее часто употребляемый конструктор этого класса:

BinaryWriter(Stream output)

где output обозначает поток, в который выводятся записываемые данные. Для записи в выходной файл в качестве параметра output может быть указан объект, создаваемый средствами класса FileStream. Если же параметр output оказывается пустым, то генерируется исключение ArgumentNullException. А если поток, определяемый параметром output, не был открыт для записи данных, то генерируется исключение ArgumentException. По завершении вывода в поток типа BinaryWriter его нужно закрыть. При этом закрывается и базовый поток.

В классе BinaryWriter определены методы, предназначенные для записи данных всех встроенных в C# типов. Некоторые из этих методов перечислены в табл. 14.5. Обратите внимание на то, что строковые данные типа string записываются во внутреннем формате с указанием длины строки. Кроме того, в классе BinaryWriter определены стандартные методы Close() и Flush (), действующие аналогично описанному выше.