Г. Шилдт - Полный справочник по C# (1160789), страница 70
Текст из файла (страница 70)
Приведем, например, только некоторые их перегруженные версии.МетодОписаниеvoid Write(int val)Записывает значение типа i n tvoid Write(double val)Записывает значение типа doublevoid Write(bool val)Записывает значение типа b o o lvoid WriteLine(string val)Записывает значение типа s t r i n g с последующим символом новой строкиvoid WriteLine(uint val)Записывает значение типа u i n t с последующим символом новой строкиvoid WriteLine(char val)Записывает символ с последующим символом новой строкиПомимо методов Write () и WriteLine (), в классе TextWriter также определеныметоды Close () и Flush ():v i r t u a l void Close()v i r t u a l void Flush()Метод Flush () записывает все данные, оставшиеся в выходном буфере, на физический носитель информации.
Метод Close () закрывает поток.Из классов TextReader и TextWriter выведен ряд символьно-ориентированныхпотоковых классов, в том числе и те, что перечислены в следующей таблице. Следовательно, эти потоковые классы используют методы и свойства, определенные в классахTextReader и TextWriter.Потоковый классОписаниеstreamReaderПредназначен для чтения символов из байтового потока. Этот класс является оболочкой длябайтового входного потокаstreamwriterПредназначен для записи символов в байтовый поток. Этот класс является оболочкой длябайтового выходного потокаstringReaderПредназначен для чтения символов из строкиstringwriterПредназначен для записи символов в строкуГлава 14.
Использование средств ввода-вывода379Двоичные потокиПомимо байтовых и символьных потоков, в С# определены два двоичных потоковых класса, которые можно использовать для прямого считывания и записи двоичныхданных. Эти классы, которые называются BinaryReader и BinaryWriter, будут рассмотрены ниже в этой главе в теме двоичного файлового ввода-вывода.Теперь, когда вы получили общее представление о С#-системе ввода-вывода, можно переходить к детальному изучению этой темы, которую, пожалуй, стоит начать сконсольного ввода-вывода.Консольный ввод-вывод данныхКонсольный ввод-вывод данных реализуется посредством стандартных потоковConsole. In, Console.Out и C o n s o l e .
E r r o r . Консольные классы ввода-вывода использовались, начиная с главы 2, поэтому вы уже с ними знакомы. Как вы убедитесьниже, они обладают и другими возможностями.Прежде всего, важно отметить, что большинство реальных С#-приложений являются не текстовыми, или консольными, а графическими программами или компонентами, которые опираются на оконный интерфейс, предназначенный для взаимодействия с пользователем. Таким образом, часть С#-системы ввода-вывода, которая связанас консольным вводом-выводом данных, не относится к широко используемым средствам. Несмотря на то что текстовые программы — прекрасные учебные примеры коротких утилит и некоторых типов компонентов, они не годятся для большинства реальных приложений.Считывание данных из консольного входного потокаПоток Console. In — экземпляр класса TextReader, поэтому для доступа к немуможно использовать методы и свойства, определенные в классе TextReader.
Однакообычно используют методы, определенные в классе Console, которые автоматическисчитывают значение свойства Console. In. В классе Console определено два методаввода информации: Read () и ReadLme ().Метод Read () используется для считывания одного символа.s t a t i c i n t Read()Метод Read () возвращает следующий символ, считанный с консоли. Он ожидает,пока пользователь не нажмет какую-нибудь клавишу, а затем возвращает результат.Считанный символ возвращается как значение типа i n t , которое должно быть приведено к типу char.
При возникновении ошибки метод ReadO возвращает —1, а в случае неудачного исхода операции генерирует исключение типа lOException. По умолчанию консольный ввод данных буферизован (с ориентацией на строки), поэтому,прежде чем введенный с клавиатуры символ будет послан программе, необходимо нажать клавишу <Enter>.Рассмотрим пример программы, которая считывает символ с клавиатуры с помощью метода Read ().// Считывание символа с клавиатуры.using System;class Kbln {public static void Main() {char ch;380Часть I.
Язык С#Console.Write{"Нажмите любую клавишу, а затем — <ENTER>: " ) ;ch = (char) Console.Read(); // Считывание// char-значения.Console.WriteLine("Вынажали клавишу: " + c h ) ;Вот как могут выглядеть результаты выполнения этой программы:Нажмите любую клавишу, а затем — <ENTER>: юВы нажали клавишу: юТот факт, что метод Read () буферизирует строки, является порой источником досадных недоразумений. При нажатии клавиши <Enter> во входной поток вводитсяпоследовательность, состоящая из символов возврата каретки и перевода строки. Более того, эти символы остаются во входном потоке до тех пор, пока вы их не прочитаете.
Таким образом, в некоторых приложениях перед выполнением следующей операции ввода их нужно удалить (просто считыванием из потока).Чтобы прочитать строку символов, используйте метод ReadLine ().static string ReadLine()Метод ReadLine () считывает символы до тех пор, пока не будет нажата клавиша<Enter>, и возвращает объект типа s t r i n g . При неудачном завершении метод генерирует исключение типа IOException.Рассмотрим программу, которая демонстрирует считывание строки из потокаConsole. In с помощью метода ReadLine ().// Ввод данных с консоли с помощью метода ReadLine().(using System;c l a s s ReadString {p u b l i c s t a t i c void Main() {string str;Console.WriteLine("Введите несколько символов.");s t r = Console.ReadLine();Console.WriteLine("Вы ввели: " + s t r ) ;Вот такие результаты можно получить при выполнении этой программы.I Введите несколько символов.I Это всего лишь тест.I Вы ввели: Это всего лишь тест.Несмотря на то что методы класса Console являются самым простым способомсчитывания данных из потока Console.
In, можно с таким же успехом вызывать методы базового класса TextReader. Например, перепишем предыдущую программу сиспользованием методов, определенных в классе TextReader.// Считывание строки с клавиатуры благодаря// непосредственному использованию свойства Console.In.using System;class ReadChars2 {public s t a t i c void Main() {string s t r ;Глава 14. Использование средств ввода-вывода381Console.WriteLine("Введите несколько символов.")/s t r = Console.In.ReadLine();Console. WriteLine ("Вы ввели: " + str 4 );Обратите внимание на то, что метод ReadLine () теперь напрямую вызывается дляпотока Console.
In. Здесь важно то, что при необходимости доступа к методам, определенным в классе TextReader, который является базовым для объекта Console. In,их можно вызывать так, как показано в этом примере.Запись данных в консольный входный потокПотоки Console.Out и C o n s o l e . E r r o r —• объекты типа TextWriter. Прощевсего консольный вывод данных выполнить с помощью методов Write О иWriteLineO, с которыми вы уже знакомы. Для каждого из встроенных типов предусмотрены отдельные версии этих методов.
В классе Console определены собственныеверсии методов Write () и WriteLine ( ) , поэтому их можно вызывать непосредственно для класса Console, как мы и делали это в примерах этой книги. Однако при желании можно вызывать эти (и другие) методы класса TextWriter, который являетсябазовым для объектов Console.Out и C o n s o l e . E r r o r .Рассмотрим программу, которая демонстрирует запись данных в потокиConsole.Out и C o n s o l e .
E r r o r .// запись данных в потоки Console.Out и C o n s o l e . E r r o r .using System;class ErrOut {public s t a t i c void Main() {int a=10, b=0;int r e s u l t ;Console.Out.WriteLine("Деление на нуль сгенерирует исключение.");try {r e s u l t = а / b; // Генерируем исключение.} catch(DivideByZeroException exc) {Console.Error.WriteLine(exc.Message);При выполнении этой программы получим следующие результаты:Деление на нуль сгенерирует исключение.Attempted to divide by zero.Иногда неопытные программисты путаются, не зная точно, когда следует использовать поток C o n s o l e . E r r o r . Если и Console.Out, и C o n s o l e .
E r r o r по умолчаниювыводят данные на консоль, то почему существует два различных потока? Ответпрост: стандартные потоки можно перенаправить на другие устройства. Например,поток C o n s o l e . E r r o r можно перенаправить для записи данных в дисковый файл, ане на экран. Следовательно, и поток ошибок можно перенаправить, например, в системный журнал (log file), не затрагивая при этом консольный вывод. И наоборот, есликонсольный вывод данных перенаправить в файл, а вывод ошибок — нет, то сообще-382Часть I.
Язык С#ния об ошибках будут появляться на консольном устройстве, и их легко увидеть. Ноподробнее о перенаправлении потоков мы поговорим ниже, когда рассмотрим файловый ввод-вывод.Класс F i l e s t r e a m и файловый ввод-выводна побайтовой основеВ С# предусмотрены классы, которые позволяют считывать содержимое файлов изаписывать в них информацию. Конечно же, дисковые файлы — самый распространенный тип файлов. На уровне операционной системы все файлы обрабатываются напобайтовой основе. Нетрудно предположить, что в С# определены методы, предназначенные для считывания байтов из файла и записи байтов в файл.