Полное руководство. С# 4.0 - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
Поток Console.In является экземпляром объекта класса TextReader, и поэтому для доступа к нему могут быть использованы методы и свойства, определенные вклассе TextReader. Но для этой цеди чаще все же используются методы, предоставляемые классом Console, в котором автоматически организуется чтение данных из потока Console.In. В классе Console определены три метода ввода. Два первых метода,Read() и ReadLine(), были доступны еще в версии .NET Framework 1.0. А третийметод, ReadKey(), был добавлен в версию 2.0 этой среды.
Для чтения одного символа служит приведенный ниже метод Read().static int Read()
Метод Read() возвращает очередной символ, считанный с консоли. Он ожидаетдо тех пор, пока пользователь не нажмет клавишу, а затем возвращает результат. Возвращаемый символ относится к типу int и поэтому должен быть приведен к типуchar. Если при вводе возникает ошибка, то метод Read() возвращает значение -1.Этот метод сгенерирует исключение IOException при неудачном исходе операцииввода. Ввод с консоли с помощью метода Read() буферизуется построчно, поэтомупользователь должен нажать клавишу , прежде чем программа получит любойсимвол, введенный с консоли.
Ниже приведен пример программы, в которой метод Read() используется длясчитывания символа, введенного с клавиатуры.// Считать символ, введенный с клавиатуры.using System;class KbIn { static void Main() { char ch; Console.Write("Нажмите клавишу, а затем — <ENTER>: "); ch = (char) Console.Read(); // получить значение типа char Console.WriteLine("Вы нажали клавишу: " + ch); }}
Вот, например, к какому результату может привести выполнение этой программы.Нажмите клавишу, а затем — <ENTER>: tВы нажали клавишу: t
Необходимость буферизировать построчно ввод, осуществляемый с консоли посредством метода Read(), иногда может быть досадным препятствием. Ведь при нажатии клавиши в поток ввода передается последовательность символов переводакаретки и перевода строки. Более того, эти символы остаются во входном буфере до техпор, пока они не будут считаны. Следовательно, в некоторых приложениях приходитсяудалять эти символы (путем их считывания), прежде чем приступать к следующей операции ввода. Впрочем, для чтения введенных с клавиатуры символов без построчнойбуферизации, можно воспользоваться рассматриваемым далее методом ReadKey().
Для считывания строки символов служит приведенный ниже метод ReadLine().static string ReadLine()
Символы считываются методом ReadLine() до тех пор, пока пользователь ненажмет клавишу <Enter>, а затем этот метод возвращает введенные символы в видеобъекта типа string. Кроме того, он сгенерирует исключение IOException при неудачном исходе операции ввода.
Ниже приведен пример программы, в которой демонстрируется чтение строки изпотока Console.In с помощью метода ReadLine().// Ввод с консоли с помощью метода ReadLine().using System;class ReadString { static void Main() { string str; Console.WriteLine("Введите несколько символов."); str = Console.ReadLine(); Console.WriteLine("Вы ввели: " + str); }}
Выполнение этой программы может привести, например, к следующему результату.Введите несколько символов.Это просто тест.Вы ввели: Это просто тест.
Итак, для чтения данных из потока Console.In проще всего воспользоваться методами класса Console. Но для этой цели можно обратиться и к методам базового класса TextReader. В качестве примера ниже приведен переделанный вариант предыдущего примера программы, в котором используется метод Rea.dLine(), определенныйв классе TextReader.// Прочитать введенную с клавиатуры строку// непосредственно из потока Console.In.using System;class ReadChars2 { static void Main() { string str; Console.WriteLine("Введите несколько символов."); str = Console.In.ReadLine(); // вызвать метод ReadLine() класса TextReader Console.WriteLine("Вы ввели: " + str); }}
Обратите внимание на то, что метод ReadLine() теперь вызывается непосредственно для потока Console.In. Поэтому если требуется доступ к методам, определеннымв классе TextReader, который является базовым для потока Console.In, то подобныеметоды вызываются так, как было показано в приведенном выше примере.Применение метода ReadKey()
В состав среды .NET Framework включен метод, определяемый в классе Consoleи позволяющий непосредственно считывать отдельно введенные с клавиатурысимволы без построчной буферизации. Этот метод называется ReadKey(). При нажатии клавиши метод ReadKey() немедленно возвращает введенный с клавиатуры символ. И в этом случае пользователю уже не нужно нажимать дополнительно клавишу<Enter>. Таким образом, метод ReadKey() позволяет считывать и обрабатывать вводс клавиатуры в реальном масштабе времени.
Ниже приведены две формы объявления метода ReadKey().static ConsoleKeyInfo ReadKey()static ConsoleKeyInfo ReadKey(bool intercept)
В первой форме данного метода ожидается нажатие клавиши. Когда оно происходит, метод возвращает введенный с клавиатуры символ и выводит его на экран.Во второй форме также ожидается нажатие клавиши, и затем возвращается введенныйс клавиатуры символ. Но если значение параметра intercept равно true, то введенный символ не отображается. А если значение параметра intercept равно false,то введенный символ отображается.
Метод ReadKey() возвращает информацию о нажатии клавиши в объекте типаConsoleKeyInfo, который представляет собой структуру, состоящую из приведенныхниже свойств, доступных только для чтения.char KeyCharConsoleKey KeyConsoleModifiers Modifiers
Свойство KeyChar содержит эквивалент char введенного с клавиатуры символа,свойство Key — значение из перечисления ConsoleKey всех клавиш на клавиатуре,а свойство Modifiers — описание одной из модифицирующих клавиш (, или ), которые были нажаты, если это действительно имело место, при формировании ввода с клавиатуры. Эти модифицирующие клавиши представлены вперечислении ConsoleModifiers следующими значениями: Control, Shift и Alt.В свойстве Modifiers может присутствовать несколько значений нажатых модифицирующих клавиш.
Главное преимущество метода ReadKey() заключается в том, что он предоставляетсредства для организации ввода с клавиатуры в диалоговом режиме, поскольку этотввод не буферизуется построчно. Для того чтобы продемонстрировать данный методв действии, ниже приведен соответствующий пример программы.// Считать символы, введенные с консоли, используя метод ReadKey().using System;class ReadKeys { static void Main() { ConsoleKeyInfo keypress; Console.WriteLine("Введите несколько символов, " + "а по окончании - <Q>."); do { keypress = Console.ReadKey(); // считать данные о нажатых клавишах Console.WriteLine(" Вы нажали клавишу: " + keypress.KeyChar); // Проверить нажатие модифицирующих клавиш. if((ConsoleModifiers.Alt & keypress.Modifiers) != 0) Console.WriteLine("Нажата клавиша <Alt>."); if((ConsoleModifiers.Control & keypress.Modifiers) != 0) Console.WriteLine("Нажата клавиша <Control>."); if((ConsoleModifiers.Shift & keypress.Modifiers) != 0) Console.WriteLine("Нажата клавиша <Shift>."); } while(keypress.KeyChar != 'Q'); }}
Вот, например, к какому результату может привести выполнение этой программы.Введите несколько символов, а по окончании - <Q>.а Вы нажали клавишу: аb Вы нажали клавишу: bd Вы нажали клавишу: dА Вы нажали клавишу: АНажата клавиша <Shift>.В Вы нажали клавишу: ВНажата клавиша <Shift>.С Вы нажали клавишу: СНажата клавиша <Shift>.• Вы нажали клавишу: •Нажата клавиша <Control>.Q Вы нажали клавишу: QНажата клавиша <Shift>.
Как следует из приведенного выше результата, всякий раз, когда нажимается клавиша, метод ReadKey() немедленно возвращает введенный с клавиатуры символ. Этимон отличается от упоминавшегося ранее метода Read(), в котором ввод выполняетсяс построчной буферизацией. Поэтому если требуется добиться в программе реакциина ввод с клавиатуры, то рекомендуется выбрать метод ReadKey().Запись данных в поток вывода на консоль