Чтение онлайн

на главную

Жанры

Полное руководство. С# 4.0
Шрифт:

где поток обозначает имя открытого потока. Этот конструктор генерирует исклю чение ArgumentException, если поток не открыт для вывода, а также исключение ArgumentNullException, если поток оказывается пустым. После создания объекта класс StreamWriter выполняет автоматическое преобразование символов в байты.

Ниже приведен простой пример сервисной программы ввода с клавиатуры и выво да на диск набранных текстовых строк, сохраняемых в файле test.txt. Набираемый тест вводится до тех пор, пока в нем не встретится строка "стоп". Для символьного вы вода в файл в этой программе используется объект класса FileStream, заключенный в оболочку класса StreamWriter. // Простая сервисная программа ввода с клавиатуры и вывода на диск, // демонстрирующая применение класса StreamWriter. using System; using System.IO; class KtoD { static void Main { string str; FileStream fout; //

Открыть сначала поток файлового ввода-вывода. try { fout = new FileStream("test.txt", FileMode.Create); } catch(IOException exc) { Console.WriteLine("Ошибка открытия файла:\n" + exc.Message); return; } // Заключить поток файлового ввода-вывода в оболочку класса StreamWriter. StreamWriter fstr_out = new StreamWriter(fout); try { Console.WriteLine("Введите текст, а по окончании — 'стоп'."); do { Console.Write(": "); str = Console.ReadLine; if(str != "стоп") { str = str + "\r\n"; // добавить новую строку fstr_out.Write(str); } } while(str != "стоп"); } catch(IOException exc) { Console.WriteLine("Ошибка ввода-вывода:\n" + exc.Message); } finally { fstr_out.Close ; } } }

В некоторых случаях файл удобнее открывать средствами самого класса StreamWriter. Для этого служит один из следующих конструкторов: StreamWriter(string путь) StreamWriter(string путь, bool append)

где путь — это имя открываемого файла, включая полный путь к нему. Если во вто рой форме этого конструктора значение параметра append равно true, то выводи мые данные присоединяются в конец существующего файла. В противном случае эти данные перезаписывают содержимое указанного файла. Но независимо от формы конструктора файл создается, если он не существует. При появлении ошибок ввода- вывода в обоих случаях генерируется исключение IOException. Кроме того, могут быть сгенерированы и другие исключения.

Ниже приведен вариант представленной ранее сервисной программы ввода с кла виатуры и вывода на диск, измененный таким образом, чтобы открывать выходной файл средствами самого класса StreamWriter. // Открыть файл средствами класса StreamWriter. using System; using System.IO; class KtoD { static void Main { string str; StreamWriter fstr_out = null; try { // Открыть файл, заключенный в оболочку класса StreamWriter. fstr_out = new StreamWriter("test.txt"); Console.WriteLine("Введите текст, а по окончании — 'стоп'."); do { Console.Write(" : "); str = Console.ReadLine; if(str != "стоп") { str = str + "\r\n"; // добавить новую строку fstr_out.Write(str); } } while(str != "стоп"); } catch(IOException exc) { Console.WriteLine("Ошибка ввода-вывода:\n" + exc.Message); } finally { if(fstr_out != null) fstr_out.Close; } } } Применение класса StreamReader

Для создания символьного потока ввода достаточно заключить байтовый поток в оболочку класса StreamReader. В классе StreamReader определено несколько кон структоров. Ниже приведен наиболее часто используемый конструктор: StreamReader(Stream поток)

где поток обозначает имя открытого потока. Этот конструктор генерирует исключе ние ArgumentNullException, если поток оказывается пустым, а также исключение ArgumentException, если поток не открыт для ввода. После своего создания объект класса StreamReader выполняет автоматическое преобразование байтов в символы. По завершении ввода из потока типа StreamReader его нужно закрыть. При этом за крывается и базовый поток.

В приведенном ниже примере создается простая сервисная программа ввода с дис ка и вывода на экран содержимого текстового файла test.txt. Она служит дополне нием к представленной ранее сервисной программе ввода с клавиатуры и вывода на диск. // Простая сервисная программа ввода с диска и вывода на экран, // демонстрирующая применение класса StreamReader. using System; using System.IO; class DtoS { static void Main { FileStream fin; string s; try { fin = new FileStream("test.txt", FileMode.Open); } catch(IOException exc) { Console.WriteLine("Ошибка открытия файла:\n" + exc.Message); return; } StreamReader fstr_in = new StreamReader(fin); try { while((s = fstr_in.ReadLine) != null) { Console.WriteLine(s); } } catch(IOException exc) { Console.WriteLine("Ошибка ввода-вывода:\n" + exc.Message); } finally { fstr_in.Close; } } }

Обратите внимание на то, как в этой программе определяется конец файла. Ког да метод ReadLine возвращает пустую ссылку, это означает, что достигнут конец файла. Такой способ вполне работоспособен, но в классе StreamReader предостав ляется еще одно средство для обнаружения конца потока — EndOfStream. Это до ступное для чтения свойство имеет логическое значение true, когда достигается конец потока, в противном случае — логическое значение false. Следовательно, свойство EndOfStream можно использовать для отслеживания конца файла. В качестве приме ра ниже представлен другой способ организации цикла while для чтения из файла. while(!fstr_in.EndOfStream) { s = fstr_in.ReadLine; Console.WriteLine(s); }

В данном случае код немного упрощается благодаря свойству EndOfStream, хотя общий порядок выполнения операции ввода из файла не меняется. Иногда такое при менение свойства EndOfStream позволяет несколько упростить сложную ситуацию, внося ясность и улучшая структуру кода.

Иногда файл проще открыть, используя непосредственно класс StreamReader, аналогично классу StreamWriter. Для этой цели служит следующий конструктор: StreamReader(string путь)

где путь — это имя открываемого файла, включая полный путь к нему. Указы ваемый файл должен существовать. В противном случае генерируется исключение FileNotFoundException. Если путь оказывается пустым, то генерируется исключе ние ArgumentNullException. А если путь содержит пустую строку, то генерируется исключение ArgumentException. Кроме того, могут быть сгенерированы исключения IOException и DirectoryNotFoundException. Переадресация стандартных потоков

Как упоминалось ранее, стандартные потоки, например Console.In, могут быть переадресованы. И чаще всего они переадресовываются в файл. Когда стандартный поток переадресовывается, то вводимые или выводимые данные направляются в новый поток в обход устройств, используемых по умолчанию. Благодаря переадресации стан дартных потоков в программе может быть организован ввод команд из дискового фай ла, создание файлов журнала регистрации и даже чтение входных данных из сетевого соединения.

Переадресация стандартных потоков достигается двумя способами. Прежде всего, это делается при выполнении программы из командной строки с помощью операто ров < и >, переадресовывающих потоки Console.In и Console.Out соответственно. Допустим, что имеется следующая программа. using System; class Test { static void Main { Console.WriteLine("Это тест."); } }

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

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

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

Таким образом, для переадресации ввода вызывается метод SetIn с указанием требуемого потока. С этой целью может быть использован любой поток ввода, при условии, что он является производным от класса TextReader. А для переадресации вывода вызывается метод SetOut с указанием требуемого потока вывода, который должен быть также производным от класса TextReader. Так, для переадресации вы вода в файл достаточно указать объект класса FileStream, заключенный в оболочку класса StreamWriter. Соответствующий пример программы приведен ниже. // Переадресовать поток Console.Out. using System; using System.IO; 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("Ошибка ввода-вывода\n" + exc.Message); } finally { if(log_out != null) log_out.Close; } } }

Поделиться:
Популярные книги

Жена моего брата

Рам Янка
1. Черкасовы-Ольховские
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Жена моего брата

Para bellum

Ланцов Михаил Алексеевич
4. Фрунзе
Фантастика:
попаданцы
альтернативная история
6.60
рейтинг книги
Para bellum

Проклятый Лекарь V

Скабер Артемий
5. Каратель
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Проклятый Лекарь V

Архил...?

Кожевников Павел
1. Архил...?
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Архил...?

Шестое правило дворянина

Герда Александр
6. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Шестое правило дворянина

Черный маг императора 3

Герда Александр
3. Черный маг императора
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора 3

На границе тучи ходят хмуро...

Кулаков Алексей Иванович
1. Александр Агренев
Фантастика:
альтернативная история
9.28
рейтинг книги
На границе тучи ходят хмуро...

Кодекс Охотника. Книга XVI

Винокуров Юрий
16. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVI

Табу на вожделение. Мечта профессора

Сладкова Людмила Викторовна
4. Яд первой любви
Любовные романы:
современные любовные романы
5.58
рейтинг книги
Табу на вожделение. Мечта профессора

Ох уж этот Мин Джин Хо 1

Кронос Александр
1. Мин Джин Хо
Фантастика:
попаданцы
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 1

Книга пяти колец. Том 3

Зайцев Константин
3. Книга пяти колец
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Книга пяти колец. Том 3

Провинциал. Книга 2

Лопарев Игорь Викторович
2. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Провинциал. Книга 2

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Ты всё ещё моя

Тодорова Елена
4. Под запретом
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Ты всё ещё моя