Перенаправление стандартных потоков
Тремя стандартными потоками, доступ к которым осуществляется через свойства Console.Out, Console.Inи Console.Error, могут пользоваться все программы, работающие в пространстве имен System. Свойство Console.Out относится к стандартному выходному потоку. По умолчанию это консоль. Например, при вызове метода Console.WriteLine() информация автоматически передается в поток Console.Out. Свойство Console.In относится к стандартному входному потоку, источником которого по умолчанию является клавиатура. Например, при вводе данных с клавиатуры информация автоматически передается потоку Console.In, к которому можно обратиться с помощью метода Console.ReadLine(). Свойство Console.Error относится к ошибкам в стандартном потоке, источником которого также по умолчанию является консоль. Однако эти потоки могут быть перенаправлены на любое совместимое устройство ввода-вывода, например, на работу с физическими файлами.
Перенаправить стандартный поток можно с помощью методов SetIn(), SetOut() и SetError(), которые являются членами класса Console:
static void Setln(TextReader input)
static void SetOut(TextWriter output)
static void SetError(TextWriter output)
Пример перенаправления потоков проиллюстрирован следующей программой, в которой двумерный массив вводится из файла input.txt, а выводится в файл output.txt
static void Main()
{
try
{
int[,] MyArray;
StreamReader file=new StreamReader("input.txt");
Console.SetIn(file); // перенаправляем стандартный входной поток на file
string line=Console.ReadLine();
string []mas=line.Split(' ');
int n=int.Parse(mas[0]);
int m=int.Parse(mas[1]);
MyArray = new int[n,m];
for (int i = 0; i < n; i++)
{
line = Console.ReadLine();
mas = line.Split(' ');
for (int j = 0; j < m; j++)
{
MyArray[i,j] = int.Parse(mas[j]);
}
}
PrintArray("исходный массив:", MyArray, n, m);
file.Close();
}
static void PrintArray(string a, int[,] mas, int n, int m)
{
StreamWriter file=new StreamWriter("output.txt"); // перенаправляем стандартный входной поток на file
Console.SetOut(file);
Console.WriteLine(a);
for (int i = 0; i < n; i++)
{
for (int j=0; j<m; j++) Console.Write("{0} ", mas[i,j]);
Console.WriteLine();
}
file.Close();
}
___input.txt_________
3 4
1 4 2 8
4 9 0 1
5 7 4 2
При необходимости восстановить исходное состояние потока Console.In можно следующим образом:
TextWriter str = Console.In; // первоначально сохраняем исходное состояние входного потока
…
Console.SetIn(str); // при необходимости восстанавливаем исходное состояние входного потока
Аналогичным образом можно восстановить исходное состояние потокаConsole.Out:
TextWriter str = Console.Out; // первоначально сохраняем исходное состояние выходного потока
…
// при необходимости восстанавливаем исходное состояние выходного потока
Console.SetOut(str);
Задание. Подумайте для чего нужно два потока Console.Out и Console.Error, если они оба при стандартной работе выводят информацию на экран.