Г. Шилдт - С#4.0 Полное руководство (1160795), страница 82
Текст из файла (страница 82)
При попытке про- читать признак конца файла возвращает пустое зна- чение Вводит все символы, оставшиеся в потоке, и возвра- щает их в виде объекта типа ясг1пд Тпг йеаб () 1пг йеаб(спас[]ЬиГТег, Тпс Тпбех, Тпг соипс) 1пг Неабв1оск(спас[]ЬиГТег, Тпг 1пбех, Тпг соипс) ягг1пи Неаб1г пе () ягг1по йеабтоЕпб() В классе техсхгзсег определены также варианты методов хг1се () и игасе11пе (), предназначенные для вывода данных всех встроенных типов. Ниже в качестве примера перечислены лишь некоторые из перегружаемых вариантов этих методов. Описание Метод чо1б Игдсе(гпг ча1ие) чозб Хг1ге(боиЬ1е ча1ие) чодб Игзге(Ьоо1 ча1ие) чо1б Иг1ге11пе(ягг1пд ча1ие) Выводит значение типа Тпс Выводит значение типа боиЬ1е Выводит значение типа Ьоо1 Выводит значение типа ясг1по с последующим символом новой строки Выводит значение типа и1пс с последующим симво- лом новой строки Выводит символ с последующим символом новой строки чозб Хгугебапе(и1пг ча1ие) чоас( Хг1ге11пе (спас ча1ие) Все эти методы генерируют исключение 1оахсерг1оп при появлении ошибки вывода.
Кроме того, в классе ТехСИгдгег определены методы С1ояе () и Р1ияп (), приведенные ниже. 436 Часть!. Язык С№ ч1гспа1 чпьс С1ояе() чггсиа1 чо1г) Г1ияь() Метод Я1о я)т ( ) организует вывод в физическую среду всех данных, оставшихся в выходном буфере. А метод С1ояе () закрывает записывающий поток и освобождает его ресурсы. Классы Техсаеаг(ег и Техсиг1сег реализуются несколькими классами символьных потоков, включая и те, что перечислены ниже. Следовательно, в этих классах потоков предоставляются методы и свойства, определенные в классах Техсаеааег и Техснгзсег, Описание Класс потока Предназначен для ввода символов из байтового потока. Этот класс является оболочкой для байтового потока ввода Предназначен для вывода символов в байтовый поток.
Этот класс является оболочкой для байтового потока вывода Предназначен для ввода символов из символьной строки Предназначен для вывода символов в символьную строку Ясгеавйеас(ег Ясгеавиг1сег Ясг1пдкеас(ег Яггтпдиг1гег Двоичные потоки Помимо классов байтовых и символьных потоков, имеются еще два класса двоичных потоков, которые могут служить для непосредственного ввода и вывода двоичных данных — Я1пагукеас(ег и Я1пагуиг1Гег. Подробнее о них речь пойдет далее в этой главе, когда дойдет черед до файлового ввода-вывода.
А теперь, когда представлена общая структура системы ввода-вывода в СФ, отведем оставшуюся часть втой главы более подробному рассмотрению различных частей данной системы, начиная с консольного ввода-вывода. Консольный ввод-вывод Чтение данных из потока ввода с консоли Поток Сопяо1е. 1п является экземпляром объекта класса Техсяеас)ег, и поэтому для доступа к нему могут быть использованы методы и свойства, определенные в Консольный ввод-вывод осуществляется с помощью стандартных потоков, представленных свойствами Сопяо1е. 1п, Сопяо1е. Сот и Сопяо1е. Еггог. Примеры консольного ввода-вывода были представлены еще в главе 2, поэтому он должен быть вам уже знаком.
Как будет показано ниже, он обладает и рядом других дополнительных возможностей. Но прежде следует еще раз подчеркнуть, что большинство реальных приложений СФ ориентированы не на консольный ввод-вывод в текстовом виде, а на графический оконный интерфейс для взаимодействия с пользователем, или же они представляют собой программный код используемый на стороне сервера.
Поэтому часть системы ввода-вывода, связанная с консолыО, не находит широкого практического применения. И хотя программы, ориентированные на текстовый ввод-вывод, отлично подходят в качестве учебных примеров, коротких сервйсных программ или определенного рода программных компонентов, для большинства реальных приложений они не годятся. Глава 14. Применение средств ввода-вывода 437 классе Техгпеа<(ег.
Но для этой цели чаще все же используются методы, предоставляемые классом Сопяо1е, в котором автоматически организуется чтение данных из потока Сопя о1е . 1п. В классе Сопя о1е определены три метода ввода. Два первых метода, Ееас) () и Ееаг)ьдпе (), были доступны еще в версии НЕТ Ргашегчог)< 1.0. А третий метод, Евас(кеу (), был добавлен в версию 2.0 этой среды. Для чтения одного символа служит приведенный ниже метод неа<) ( ) . яоаг1с 1пс Кеас() Метод Ееа<(() возвращает очередной символ, считанный с консоли. Он ожидает до тех пор, пока пользователь не нажмет клавишу, а затем возвращает результат.
Возвращаемый символ относится к типу дпг и поэтому должен быть приведен к типу спас. Если при вводе возникает ошибка, то метод Ееас) () возвращает значение — 1. Этот метод сгенерирует исключение 10Ехсерггоп при неудачном исходе операции ввода. Ввод с консоли с помощью метода Ееас) () буферизуется построчно, поэтому пользователь должен нажать клавишу <Еп(ег>, прежде чем программа получит любой символ, введенный с консоли. Ниже приведен пример программы, в которой метод Ееас(() используется для считывания символа, введенного с клавиатуры. // Считать символ, введенный с клавиатуры. ояьпд Яуяоеш; с1аяя Ксгп ( яоаг1с чогс Ма1п() ( соаг с)п Сопво1е.иг1се("Нажмите клавишу, а затем — <ЕНТЕН>: "); сь = (сваг) Сопяо1е.яеас(); // получить значение типа соаг Сопяо1е.нгьсеььпе("Вы нажали клавишу: " е сЛ); Вот, например, к какому результату может привести выполнение этой программы.
Нажмите клавишу, а затем — <ЕНТЕН>: Вы нажали клавишу: Необходимость буферизировать построчно ввод осуществляемый с консоли посредством метода Ее а<) ( ), иногда может быть досадным препятствием. Ведь при нажатии клавиши <Еп(ег> в поток ввода передается последовательность символов перевода каретки и перевода строки. Более того, эти символы остаются во входном буфере до тех пор, пока они не будут считаны. Следовательно, в некоторых приложениях приходится удалять эти символы (путем их считывания), прежде чем приступать к следующей операции ввода. Впрочем, для чтения введенных с клавиатуры символов без построчной буферизации, можно воспользоваться рассматриваемым далее методом Ееас(кеу () .
Для считывания строки символов служит приведенный ниже метод КеаЖТпе () . ясагьс яогьпв Ееасьдпе () Символы считываются методом Неас(Е1пе () до тех пор, пока пользователь не нажмет клавишу <Еп(ег>, а затем этот метод возвращает введенные символы в виде 438 Часть!. Язык С№ объекта типа з с гьпд. Кроме того, он сгенерирует исключение 10ех сера 1 оп при неудачном исходе операции ввода. Ниже приведен пример программы, в которой демонстрируется чтение строки из потока Сопзо1е. 1п с помощью метода Веас)Ыпе () . // Ввод с консоли с помоиью метода Веазъьпе() пзгпэ ЗузпеюГ с1азв Веаг)згг1пэ ( заааьс чо1г) Ма1п() ( зсг1пЧ зсгГ Сопво1е.Хг1аеььпе("Введите несколько символов.") згг = Сопзо1е.веааъгпе(); Сопзо1е.нгьгеъьпе("Вы ввели: " + ваг)Г Выполнение этой программы может привести, например, к следующему результату.
Введите несколько символов. Это просто теат. Вы ввели: Это просто тест. Итак, для чтения данных из потока Сопя о 1е . 1п проще всего воспользоваться методами класса Сопзо1е. Но для этой цели можно обратиться и к методам базового класса Техгйеаг)ег. В качестве примера ниже приведен переделанный вариант предыдущего примера программы, в котором используется метод Веаг)11пе (), определенный в классе Техгйеас)ег. Прочитать введенную с клавиатуры строку непосредственно из потока Сопзо1е.1п.
озгпэ Бузаепи а1азз Веаг)С)гагз2 ( зава1с чо16 Маьп () ( всггпд зсг; Сопзо1е.Хг1аеьгпе("Введите неаколько символов."); зсг = сопзо1е.1п.кеаг)ьгпе(); О вызвать метод кеасглпе() класаа техгаеаоег сопзо1е.хгггеььпе("Вы ввели: " т зсг)г Обратите внимание на то, что метод НеаЖ1пе () теперь вызывается непосредственно для потока Сопзо1е. 1п.
Поэтому если требуется доступ к методам, определенным в классе Техгйеаг)ег, который является базовым для потока Сопзо1е. 1п, то подобные методы вызываются так, как было показано в приведенном выше примере. Применение метода йеайКеу () В состав среды )ЧЕТ Егатегеог)с включен метод, определяемый в классе Сопзо1е и позволяющий непосредственно считывать отдельно введенные с клавиатуры символы без построчной буферизации. Этот метод называется неас)Ке у ( ) . При нажа- Глава 14.
Применение средств ввода-вывода 439 тии клавиши метод Кеабкеу () немедленно возвращает введенный с клавиатуры символ. И в этом случае пользователю уже не нужно нажимать дополнительно клавишу <Еп1ег>. Таким образом, метод Кеабкеу () позволяет считывать и обрабатывать ввод с клавиатуры в реальном масштабе времени. Ниже приведены две формы объявления метода НеабКеу ( ) . япаггс Сопяо1екеу1пго Неабкеу() ягагьс Сопяо1екеугпго Неабкеу(Ьоо1 бпсегсерг) В первой форме данного метода ожидается нажатие клавиши.
Когда оно происходит, метод возвращает введенный с клавиатуры символ и выводит его на экран. Во второй форме также ожидается нажатие клавиши, и затем возвращается введенный с клавиатуры символ. Но если значение параметра 1п Сегсерг равно Сгце, то введенный символ не отображается. А если значение параметра дпгегсерг равно га1яе, то введенный символ отображается. Метод Кеабкеу () возвращает информацию о нажатии клавиши в объекте типа Сопяо1еКеу1п1о, который представляет собой структуру, состоящую из приведенных ниже свойств, доступных только для чтения.
спас Кеусьаг Сопво1еКеу Кеу Сопяо1еноб111егя Мобгггегя Свойство КеуСЬаг содержит эквивалент спас введенного с клавиатуры символа, свойство Кеу — значение из перечисления Сопяо1еКеу всех клавиш на клавиатуре, а свойство Моб111егя — описание одной из модифицирующих клавиш 1<А(1>, <С1г!> или <ВЫ11>), которые были нажаты, если это действительно имело место, при формировании ввода с клавиатуры. Эти модифицирующие клавиши представлены в перечислении сопяо1емоб1вдегя следующими значениями: сопсго1, Блдгс и А1с. В свойстве Моб1Г1егя может присутствовать несколько значений нажатых модифицирующих клавиш.
Главное преимущеспю метода Кеабкеу () заключается в том, что он предоставляет средства для организации ввода с клавиатуры в диалоговом режиме, поскольку этот ввод не буферизуется построчно. Для того чтобы продемонстрировать данный метод в действии, ниже приведен соответствующий пример программы. Считать символы, введенные с консоли, используя метод НеабКеу(). цягпд Яуясеш; с1аяя Неабяеуя ( ягатьс чово Магд() ( Сопяо1екеугпго 'квургеяя; Сопяо1е.игггеьтпе("Введите несколько символов, "а по окончании — <О>.")„.
бо ( Хеургевя = Сопво1е.кеабКеу(); // считать данные о нажатых клавишах Сопяо1в.нг1геъьпе(" Вы нажали клавишу: " + Хвургеяв.яеусьаг); О Проверить нажатие модифицирующих клавиш. 11((сопяо1енод111егя.я1С Я Кеургеяя.моб111егя) )= О) сопво1е.нг1сеьдпе("нажата клавиша <лгс>."); 11((сопяо1енод111егя.сопгго1 Я 'хеургеяя.ноб111егя) != 0) 440 Часть (. Язык С() Сопяо1е.иггсеььпе (" Нажата клавюла <Сопсго1> . ") 1 1г((сопяо1еноогтгегя.БЫГГ Ь Хеургеяя.нос[111егя) (= О) Сопяо1е.иггсеъьпе["Нажата клавиша <БЬ11Г>."); ) ньг1е(кеургеяя.кеуСЬаг [= 'О'); ) Вот, например, к какому результату может привести выполнение этой программы.