Г. Шилдт - С#4.0 Полное руководство (1160795), страница 83
Текст из файла (страница 83)
Введите несколько символов, а по окончании — <О>. а Вы нажали клавишу: а Ь Вы нажали клавишу: Ь <[ Вы нажали клавишу: С А Вы нажали клавишу: А Нажата клавиша <Бвьтг>. В Вы нажали клавишу: В Нажата клавиша <БЬ>ГГ>. С Вы нажали клавишу: С Нажата клавиша <БЬ11г>. Вы нажали клавишУ: нажата клавиша <сопгго1>.
О Вы нажали клавишу: О Нажата клавиша <БЬ1гс>. / Как следует из приведенного выше результата, всякий раз, когда нажимается клавиша, метод Ееабкеу () немедленно возвращает введенный с клавиатуры символ. Этим он отличается от упоминавшегося ранее метода Неаг( (), в котором ввод выполняется с построчной буферизацией. Поэтому если требуется добиться в программе реакции на ввод с клавиатуры, то рекомендуется выбрать метод Ееаг(Кеу () . Запись данных в поток вывода на консоль Потоки Сопяо1е. Оцг и Сопзо1е. Еггог являются объектами типа Техгиг1сег.
Вывод на консоль проще всего осуществить с помощью методов Игьсе () и Иг г СеЬ1пе (), с которыми вы ух<е знакомы. Существуют варианты этих методов для вывода данных каждого из встроенных типов. В классе Сопяо1е определяются его собственные варианты метода Иг1се () и Нггсеьгпе (), и поэтому они могут вызываться непосредственно для класса Сопяо1е, как это было уже не раз показано на страницах данной книги.
Но при желании эти и другие методы могут быль вызваны и для класса Техснг1гег, который является базовым для потоков Сопзо1е. Оцг и Сопяо1е. Еггог. Ниже приведен пример программы, в котором демонстрируетсл вывод в потоки Сопзо1е. Оцс и Сопяо1е. Еггог. По умолчанию данные в обоих случаях выводятся на консоль. // Организовать вывод в потоки Сопяо1е.оцс и Сопяо1е.Еггог. ця1пд Буясеш; с1аяя Еггоцс ( ясасгс чогс( Маьп() ( 1пс а=10, Ь=О; тпг геяц1г; Сопяо1е.опс.нг1гевьпе(шделение на нуль приведет "к исключительной ситуации."); Глава 14.Применение оредош ввода-вывода 441 сгу ( гевп1С = а / Ь; // сгенерировать исключение при попытке деления на нуль сагсЬ(П1чтоевузегоЕхсергьоп ехс) ( Сопво1е.Еггог.игьгегдпе(ехс.мевваде); ) ) ! При выполнении этой программы получается следующий результат.
Деление на нуль приведет к исключительной ситуации. Попытка деления на нуль. Начинающие программисты порой испытывают затруднения при использовании потока Сопво1е. Еггог. Перед ними невольно встает вопрос если оба потока, Сопво1е . Опс и Сопя о1е. Еггог, по умолчанию выводят результат на консоль, то зачем нужны два разных потока вывода? Ответ на этот вопрос заключается в том, что стандартные потоки могут быть переадресованы на другие устройства. Так, поток Сопво1е. Ехгог можно переадресовать в выходной файл на диске, а не на экран.
Это, например, означает, что сообщения об ошибках могут быть направлены в файл журнала регистрации, не мешая выводу на консоль. И наоборот, если вывод на консоль пере- адресуется, а вывод сообщений об ошибках остается прежним, то на консоли появятся сообщения об ошибках, а не выводимые на нее данные. Мы еще вернемся к вопросу переадресации после рассмотрения файлового ввода-вывода. Класс Б'з.1е8сгеатв и байтовый ввод-вывод в файл В среде .)х)ЕТ баташев(ог)с предусмотрены классы для организации ввода-вывода в файлы.
Безусловно, это в основном файлы дискового типа. На уровне операционной системы файлы имеют байтовую организацию. И, как следовало ожидать, для ввода и вывода байтов в файлы имеются соответствующие. методы. Поэтому ввод и вывод в файлы байтовыми потоками весьма распространен. Кроме того, байтовый поток ввода или вывода в файл может быть заключен в соответствующий объект символьного потока. Операции символьного ввода-вывода в файл находят применение при обработке текста.
О символьных потоках речь пойдет далее в этой главе, а здесь рассматривается байтовый ввод-вывод. Для создания байтового потока, привязанного к файлу, служит класс Е11еБЬгеаьь Этот класс является производным от класса Бггеат и наследует всего его функции. Напомним, что классы потоков, в том числе и Г11еБьгеагь определены в пространстве имен Бувсею. 10. Поэтому в самом начале любой использующей их программы обычно вводится следующая строка кода.
пвьпд Бувгею.10; Открытие и закрытие файла Для формирования байтового потока, привязанного к файлу, создается объект класса Г11еБЬгеааь В этом классе определено несколько конструкторов. Ниже приведен едва ли не самый распространенный среди них: Е11езггеаю(вггьпд путь, Еь1еМоое режим) 442 Часть!. Язык С() где путь обозначает имя открываемого файла, включая полный путь к нему; а режим — порхдок открытия файла.
В последнем случае указывается одно из значений, определяемых в перечислении Р11енобе и приведенных в табл. 14.4. Как правило, этот конструктор открывает файл для доступа с целью чтения или записи. Исключением из этого правила служит открытие файла в режиме Г11еМобе. Аррепб, когда файл становится досгупным только для записи.
Таблица 14.4. Значения из перечисления Е11еМобе Значение Описание Г11еМобе.Аррепс1 Р11еМобе.Сгеаге Добавляет выводимые данные в конец файла Создает новый выходной файл. Существующий файл с таким же именем будет разрушен Создает новый выходной файл. Файл с таким же именем не должен существовать Открывает существующий файл Открывает файл, если он существует. В противном случае создает новый файл Открывает существующий файл, но сокращает его длину до нуля Р11еиобе.Сгеагеиеы Г11еиог(е.Орел Р11енос)е.ОрепОгСгеаге Г11енобе.Тгппсаге Г11еэсгеаш 11п; ггу ( 11п = пен Е11евсгеаш(тгевс", Е11еноде.орел); сассд(1ОЕхсерсьоп ехс) ( // перехватить все исключения, связанные с вводом-выводом Сопво1е.нгьсеььпе(ехс.Меввапе)) // Обработать ошибку.
) сапов(Ехсерс1оп ехс ( // перехватить любое другое исключение. сопао1е.игьгеььпе(ехс.мевваде); // Обработать ошибку, если это возможно. Если попытка открыть файл оказывается неудачной, то генерируется исключение. Если же файл нельзя открыть из-за того что он не существует, генерируется исключение Р11емогроппдехсерсзоп. А если файл нельзя открыть из-за какой- нибудь ошибки ввода-вывода, то генерируется исключение 10Ехсергьоп. К числу других исключений, которые могут быть сгенерированы при открытии файла, относятся следующие: Агпптепгии11Ехсерс1оп (указано пустое имя файла), АгдишепСЕхсергьоп (указано неверное имя файла), АгппшепСООСОЖаппеЕхсергзоп (указан неверный режим), ЕеопгзсуЕхсерс1оп (у пользователя нет прав доступа к файлу), Раб)тТооьопоЕхсерг1оп (слишком длинное имя файла или путь к нему), нос Епрро ггебЕхсергзол (в имени файла указано устройство, которое не поддерживается), а также Рзгессогуногроппс)Ехсергьоп (указан неверный каталог).
Исключения Раб)ттооьопдЕхсерг1оп, РзгессогуиогроппбЕхсерг1оп и Р11еиогроппбЕхсерсзоп относятся к подклассам класса исключений 10Ехсерг1оп. Поэтому все они могут быть перехвачены, если перехватывается исключение 10Ехсергьоп. Ниже в качестве примера приведен один из способов открытия файла гевс. бас для ввода. Глава 14. Применение средств ввода-вывода 443 !Г Яде рав сгенерировать необрабатьгваеные исключения. ) В первом блоке сагой из данного примера обрабатываются ошибки, возникающие в том случае, если файл не найден, путь к нему слишком длинен, каталог не существует, а также другие ошибки ввода-вывода. Во втором блоке пасс)г, который является "универсальным" для всех остальных типов исклк)чений, обрабатываются другие вероятные ошибки (возможно, даже путем повторного генерирования исключения).
Кроме того, каждую ошибку можно проверять отдельно, уведомляя более подробно о ней и принимая конкретные меры по ее исправлению. Ради простоты в примерах, представленных в этой книге, перехватывается только исключение 10кхсерС1оп, но в реальной программе, скорее всего, потребуется перехватывать и другие вероятные исключения, связанные с вводом-выводом, в зависимое.ги от обстоятельств. Кроме того, в обработчиках исключений, приводимых в качестве примера в этой главе, просто уведомляется об ошибке, но зачастую в них должны быть запрограммированы конкретные меры по исправлению ошибок, если это вообще возможно.
Например, можно предложить пользователю еще раз ввести имя файла, если указанный ранее файл не был найден. Возможно, также потребуется сгенерировать исключение повторно. Как упоминалось выше, конструктор класса Г11еЯСгеаю открывает файл, доступный для чтения или записи. Если же требуется ограничить доступ к файлу только для чтения или же только для записи, то в таком случае следует использовать такой конструктор. Гх1езсгеаю(нсггпд путь, Г11енобе реигнг, Г11елссезз доступ) Как и прежде, путь обозначает имя открываемого файла, включая и полный путь к нему, а режим — порядок открытия файла.