Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 81
Текст из файла (страница 81)
В целом эти методы способны генерировать исключение 10Ехсерггоп при появлении ошибки ввода, а некоторые из них — исключения других типов. Особый интерес вызывает метод цеаг(Б1пе (), предназначенный для ввода целой текстовой строки, возвращая ее в виде объекта типа ясг1пд. Этот метод удобен для чтения входных данных, содержащих пробелы. Глава (4. Применение средств ввода-вывода 421 В классе техсигакег определены также варианты методов Иг1се () и Иггсепйпе П, предназначенные для вывода данных всех встроенных типов.
Ниже в качестве примера перечислены лишь некоторые из перегружаемых вариантов этих методов. Описание Метод Выводит значение типа гпг Выводит значение типа поиьте Выводит значение типа ьоо1 типа ягггпд с последующим символом но- чоха Хгьсеьгпе(иьпс ча1) типа и1пг с последующим символом новой чогп Иг1ГеЬгпе (слаг ча1) последующим символом новой строки Все эти методы генерируют исключение 10ехсергаоп при появлении ошибки вывода. Кроме того, в классе Техгнг1гег определены методы С1ояе () и Е1ияп (), приведенные ниже.
чагсия1 чоха С1ояе() чггтиа1 чога Г1иян() Метод г1ияп () организует вывод в физическую среду всех данных, оставшихся в выходном буфере. А метод С1ояе () закрывает поток. Классы Техгйеаг(ег и Техтиг1кег реализуются несколькими классами символьных тютоков, включая и те, что перечислены ниже. Следовательно, в этих классах предоставляются методы и свойства, определенные в классах Техскеаг)ег и ТехГИгусег. Класс потока Описание Предназначен для ввода символов нз байтового потока.
Этот класс является оболочкой для байтового потока ввода Предназначен для вывода символов в байтовый поток. Этот класс является обо- лочкой для байтового потока вывода яггеаваеяйег Зсгеавнг1сег ягггпоаеаоег ясг1пснг1сег Предназначен для ввода символов нз строки Предназначен для вывода символов в строку Двоичные потоки Помимо классов байтовых н символьных потоков, имеются еще два класса двоичных потоков, которые могут служить для непосредственного ввода н вывода двоичных данных — В1пагуйеаг)ег н В1пагуиг1тег. Подробнее о них речь пойдет далее в этой главе, когда дойдет черед до файлового ввода-вывода. А теперь, когда представлена общая структура системы ввода-вывода в С№, отведем оставшуюся часть этой главы более подробному рассмотрению различных частей данной системы, начиная с консольного ввода-вывода.
Консольный ввод-вывод Консольный ввод-вывод осуществляется с помощью стандартных потоков, представленных свойствами Сопяо1е. 1п, Сопяо1е. Оит и Сопяо1е. Еггог. Примеры консольного чо1О Хг1се(1пс ча1) чо1г( Хг1се(г(оиЬЬе чя1) чогб Хггсе(Ьоо1 чя1) чоха ХггсеЬ1пе(ясггпс чя1) Выводит значение вой строки Выводит значение строки Выводит символ с 422 часть (, йзык сз ввода-вывода были представлены еще в главе 2, поэтому ои должен быть вам уже знаком. 'г(ак будет показано ниже, ои обладает и рядом других дополнительных возможностей. Но прежде следует еще раз подчеркнуть, что большинство реальных приложений С(Г ориентированы ие иа консольный ввод-вывод в текстовом виде, а иа графический оконный интерфейс для взаимодействия с пользователем, или же сии представляют собой программный код, используемый иа стороне сервера.
Поэтому часть системы ввода- вывода, связанная с консолью, ие находит широкого практического применения, И хотя программы, ориентированные иа текстовый ввод-вывод, отлично подходят в качестве учебных примеров, коротких сервисных программ или определенного рода программных компонентов, для большинства реальных приложений оии ие годятся. Чтение данных из потока ввода с консоли Поток Сопзо1е. 1п является экземпляром объекта класса техгпеас)ег, и поэтому для доступа к нему могут быть использованы методы и свойства, определенные в классе техснеаг(ег. Но для этой цели чаще все же используются методы, предоставляемые классом Сопзо1е, в котором автоматически организуется чтение данных из потока сопзо1е. 1п. В классе сопзо1е определены три метода ввода. Два первых метода, Неас(() и Неаг(Ыпе (), были доступны еше в версии.)ь)ЕТ Ргатеьуог)г 1.0.
А третий метод, Неаг)кеу (), был добавлен в версию 2.0 этой среды. Для чтения одного символа служит приведенный ниже метод Неаг) () . вгагъс дог Неаг(() Метод Неаг( () возвращает очередной символ, считанный с консоли. Ои ожидает до тех пор, пока пользователь ие нажмет клавишу, а затем возвращает результат. Возвращаемый символ относится к типу ъпг и поэтому должен быть приведен к типу сйаг. Если при вводе возникает ошибка, то метод Неап () возвращает значение -1. Этот метод сгеиерирует исключение 10кхсергдоп при неудачном исходе операции ввода. Ввод с консоли с помощью метода неас( () буферизуется построчно, поэтому пользователь должен нажать клавишу <Епгег>, прежде чем программа получит любой символ, введенный с консоли.
Ниже приведен пример программы, в которой метод неаг( () используется для считываиия символа, введенного с клавиатуры. // Считать символ, введенный с клавиатуры. чз1вс Зувсежо с1авз Кото ( зсас1с чо1о Мадо() ( сват сты сопзо1е.иггсе (" нажмите клавишу, а затем — <ннткнгм "); св = (сЬаг) Солво1е.кеаг(()/ // получить значение типа сваг Сопво1е.кгъсеьдое("Вы нажали клавишу: " + св); Вот, например, к какому результату может привести выполиеиие этой программы: Глава 14.
Применение средств ввода.вывода 423 Нажмите клавишу, а затем — <ЕНТЕН>: С Вы нажали клавишу: С Необходимость буферизировать построчно ввод, осуществляемый с консоли посредством метода неас( (), иногда может быть досадным препятствием. Ведь при нажатии клавиши <Епсег> в поток ввода передается последовательность символов перевода каретки и перевода строки.
Более того, эти символы остаются во входном буфере до тех пор, пока они не будут считаны. Следовательно, в некоторых приложениях приходится удалять эти символы (путем их считывания), прежде чем приступать к следующей операции ввода. Впрочем, для чтения символов, введенных с клавиатуры без построчной буферизации, можно воспользоваться рассматриваемым далее методом Неас)Кеу () . Для считывания строки символов служит приведенный ниже метод неаЖ1пе () .
зтапвс звсдпд аеас(Ъ1пе () Символы считываются методом неапейпе () до тех пор, пока пользователь не нажмет клавишу <Епсег>, а затем этот метод возвращает введенные символы в виде объекта типа зсгспс. Кроме того, он сгенерирует исключение 10ехсерсдоп при неудачном исходе операции ввода. Ниже приведен пример программы, в которой демонстрируется чтение строки из потока Сопзо1е. Хп с помощью метода НеаЖ1пе () . // Ввод с консоли с помошью метода Неас(ьспе(). пз1по Бузтешт с1азз Кеас)БСс1пд ( зтаС1с тото Маьп() ( згг1пя зСг' Сопзо1е.игьтевдпе("Введите несколько символов.") зег = Сопзо1е.неаатвпе()т Сопао1е.иг1сеъспе("Вы ввели: " + зСг); ) Выполнение этой программы может привести, например, к следующему результату: Введите несколько символов.
Это просто тест. Вы ввели: Это просто тест. Итак, для чтения данных из потока Сопзо1е. 1п проще всего воспольэоваться Мстодами класса Сопзо1е. Но для этой цели можно обратиться и к методам базового класса ТехСНеас(ег. В качестве примера ниже приведен переделанный вариант предыдущего Примера программы, в котором используется метод Неат(Ь1пе (), определенный в классе Техеиеас(ег.
// Прочитать введенную с клавка~уды строку // непосредственно из потока Сопзо1е.1п. озспд Бузсеш; с1азз Реас(сьасзэ ( зеаС1с чоад На1п() ( 424 часть!. яаыс сз зсгдпч зсс; Соозо1з.нг1геъсое("Введите несколько символов.")! згг = Сопзо1з.тп.кеас(ь1ое()с // вызвать метод // Кеацъазе() класса тзхгкеас(ег Сопяо1е.нгхгеьдое("Вы ввели: " + згг); ) Обратите внимание на то, что метод Кеас(ь1пе () теперь вызывается непосредственно для потока Сопяо1е. 1п. Поэтому если требуется доступ к методам, определенным в классе с ехспеас)ег, который является базовым для потока Сопзо1е. 1п, то подобные методы вызываются так, как было показано в приведенном выше примере. Применение метода Ееас3Кеу () Начиная с версии 2.0 в состав среды .НЕТ Егашесзог)с был включен метод, определяемый в классе Сопзо1е и позволяющий непосредственно считывать отдельно введенные с клавиатуры символы без построчной буферизации.
Этот метод нззывается Кеас(кеу () . При нажатии клавиши метод Кеас(кеу () немедленно возвращает введенный с клавиатуры символ. И в этом случае пользователю уже не нужно нажимать дополнительно клавишу <Епсег>. Таким образом, метод кеас(Кеу () позволяет считывать и обрабатывать ввод с клавиатуры в реальном масштабе времени. Ниже приведены две формы объявления метода Кеас(кеу () .
зьаС1с Сопзо1екеу1псо аеас(кзу() зсасас сопзо1зкзу1ого квас)кзу(ьоо1 поп1зр1ау) В первой форме данного метода ожидается нажатие клавиши. Когда оно происходит, метод возвращает введенный с клавиатуры символ и выводит его на экран. Во второй форме также ожидается нажатие клавиши, и затем возвращается введенный с клавиатуры символ. Но если значение параметра поп1зр1ау равно Сгое, то введенный символ не отображается. А если значение параметра поп1зр1ау равно 1а1зе, то введенный символ отображается. Метод Пеас)кеу() возвращает информацию о нажатии клавиши в объекте типа сопзо1екеу1пго, который представляет собой структуру, состоящую из приведенных ниже свойств, доступных только для чтения. сьаг КеуСЬаг Сопзо1зКеу Кеу Соозо1еиос(111егз Мос)111згз Свойство КеуСЛаг содержит эквивалент спаг введенного с клавиатуры символа, свойство Кеу — значение из перечисления Сопзо1еКеу всех клавиш на клавиатуре, а свойство Мос(111 е гя — описание одной из модифицирующих клавиш (<А) С>, <Сгг(> или <БЬЖ>), которые были нажаты, если это действительно имело место, при формировании ввода с клавиатуры.
Эти модифицирующие клавиши представлены в перечислении Сопзо1емос(111егз следующими значениями: Сопгго1, БЬ111 и А1Ш В свойстве мог)111егз может присутствовать несколько значений нажатых модифицирующих клавиш. Главное преимущество метода Кеас(кеу () заключается в том, что он предоставляет средства для организации ввода с клавиатуры в диалоговом режиме, поскольку этот ввод не буферизуется построчно. Для того чтобы продемонстрировать данный метод в действии, ниже приведен соответствующий пример программы. // Считать символы, введенные с консоли, // используя метод аеас(кеу().
пзтпо Бузвешт с1азз Неаокеуз ( звавтс чоьд Матп() ( Сопзо1екеутпхо Хеургеззт Сопзо1е.Иг1Сетфпе("Введите несколько символов, "а по окончании — <О>.")) с(о ( Кеуртезз = Сопзо1е.веаОКеу()т // считать данные о нажатых клавишах Сопзо1е.нт1веъ1пе(" Вы нажали клавишу: Хеургезз.кеуснат); // Проверить нажатие модифицирующих клавиш. 11((сопзо1еио<(1Т1етз.А1С а Хеуртезз.ио01Т1етз) != О) Сопзо1е.нх1сеътпе("Нажата клавиша <А1С>.")т 11((сопзо1еиоНШехз.Сопвто1 з Кеурхезз.мооьдьехз) != О) сопзо1е.игтсевдпе("нажата клавиша <сопссо1>.")т 11((сопзо1емос(шегз.зь1йс з хеуртезз.мостдьетз) != О] Сопзо1е.нт1хеъ1пе("Нажата клавиша <БЬ1тз>."); ) нЬ11е(хеурхезз.КеуСЬат != 'П')) ) Вот, например, к какому результату может привести выполнение этой программы: а по окончании — <О>. Как следует из приведенного выше результата, всякий раз, когда нажимается клавиша, метод Неа<(кеу() немедленно возвращает введенный с клавиатуры символ.