Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 82
Текст из файла (страница 82)
Этим он отличается от упоминавшегося ранее метода Неас((), в котором ввод выполняется с построчной буферизацией. Поэтому если требуется добиться в программе реакции на ввод с клавиатуры, то рекомендуется выбрать метод Неас(кеу () . Запись данных в поток вывода на консоль Потоки Сопзо1е. Онс и Сопзо1е. Ет сот являются объектами типа Техент10ет.
Выводна консоль проще всего осуществить с помощью методов Ихфее () и Иг1сеЬ1пе (), с которыми вы уже знакомы. Существуют варианты этих методов для вывода данных Введите несколько символов а Вы нажали клавишУ: а Ь Вы нажали клавишУ: Ь т( Вы нажали клавишу: т( А Вы нажали клавишу: А Нажата клавиша <БЬ11С>. В Вы нажали клавишу: В нажата клавиша <Бьтйс>. С Вы нажали клавишУ: С нажата клавиша <Бь11с>.
° Вы нажали клавишу: Нажата клавиша <Сопехо1>. 0 Вы нажали клавишу: 0 Нажата клавиша <БЬТТС>. Гаева (4, Применение средств ввода. вывода 425 426 Часть!. Язык С№ каждого из встроенных типов. В классе Сопяо1е определяются его собственные варианты метода иттсе () и ит№сеейпе (), и поэтому оии могут вызываться непосредственно для класса Сопзо1е, как это было уже ие раз показано на страницах данной книги. Но при желании эти и другие методы могут быть вызваны и для класса техситттет, который является базовым для потоков Сопяо1е. Оцт и Сопяо1е.
Еттот. Ниже приведен пример программы, в котором демонстрируется вывод в потоки Сопяо1е. Оцс и Сопзо1е. Еттот. По умолчанию данные в обоих случаях выводятся иа консоль. // Организовать вывод в потоки Сопяо1е.опт и // Сопяо1е.Бттот. ця1по Яуятею; с1аяя Еттоцт ( ятат1с чогс маге П ( тпт а=10, Ь=О; Епт теяц1ск Сопяо1е.оцт.ыт1теЬ№пе("Деление на нуль приведет " + "к исключительной ситуации."); тту ( теяц1т = а / Ь; // сгенерировать исключение при // попытке деления на нуль ) сатсп СО1чю№езузетоЕхсерт1оп екс) ( Сопяо1е.Еттот.ыт1теЬ№пе(екс.иеяяаде)к ) ) При выполнении этой программы получается следующий результат: Деление на нуль приведет к исключительной ситуации.
Попытка деления на нуль. Начинающие программировать порой испытывают затруднения при использовании потока Сопзо1е. Еттот. Перед ними невольно встает вопрос: если оба потока, Сопяо1е. Опт и Сопяо1е. Еттот, по умолчанию выводят результат иа консоль, то зачем иужиы два разных потока вывода? Ответ иа этот вопрос заключается в том, что сгацдартиые потоки могут быть переадресованы иа другие устройства. Так, поток Сопзо1е. Еттот можно переадресовать в выходной файл иа диске, а ие иа экраи.
Это, например, означает, что сообщения об ошибках могут быть направлены в файл журнала регистрации, ие мешая выводу иа консоль. И наоборот, если вывод иа консоль переадресовывается, а вывод сообщений об ошибках остаегся прежним, то иа консоли появятся сообщения об ошибках, а ие выводимые иа иее данные. Мы еще вернемся к вопросу переадресации после рассмотрения файлового ввода-вывода. Класс ~х1еЯ~геав и байтовый ввод-вывод в файл В среде .)ь)ЕТ Ггашекчог(к предусмотрены классы для организации ввода-вывода в файлы. Безусловно, это в основном файлы дискового типа.
На уровне операционной системы файлы имеют байтовую организацию. И как следовало ожидать, для ввода и вывода бай- Глава 14, Применение средств ввода-вывода 427 тов в файлы имеются соответствующие методы. Поэтому ввод и вывод в файлы байтовыми потоками весьма распространен. Кроме того, байтовый поток ввода или вывода в файл может быть заключен в соответствующий объект символьного потока. Операции символьного ввода-вывода в файл находят применение при обработке текста.
О символьных потоках речь пойдет далее в этой главе, а здесь рассматривается байтовый ввод-вывод. Для создания байтового потока, привязанного к файлу, служит класс Г11еяггеалт Этот класс является производным от класса Ятгеаю и наследует всего его функции. Напомним, что классы потоков, в том числе и г11еЯггеаль определены в пространстве имен Яузсею.1О. Поэтому в самом начале любой использующей их программы обычно вводится следующая строка кода: па1пд Яузтем.10; Открытие и закрытие файла Для формирования байтового потока, привязанного к файлу, создается объект класса Г11еЯГгеаю. В этом классе определено несколько конструкторов. Ниже приведен едва ли ие самый распространенный среди иих. Г11еБГгеам 1зтггпд имч файла, Г11еМоде режим1 таблица 14.4.
Значения из перечислению Г11еМопе Значейие Описание Г11еиоое.дррепо Г11емоце.егеасе Добавляет выводимые данные в конец файла Создает новый выходной файл. Существующий файл с таким же име- нем будет разрушен Г11еиопе.ггеатеиен Создает новый выходной файл. Файл с таким же именем не должен существовать Г11еиопе.орел Г11емоце.орепотсгеаге Открывает существующий файл Открывает файл, если он существует.
В противном случае создает новый файл Г11еиобе.тгппсате Открывает существующий файл, но сокращает его длину до нуля Если попытка открыть файл оказывается неудачной, то генерируется исключение. Если же файл нельзя открыть из-за того что ои ие существует, генерируется исключение Г11емоггоипг1ехсерг1оп. А если файл нельзя открыть из-за какой-нибудь ошибки ввода-вывода, то генерируется исключение 1ОЕхсерс1оп. К числу других исключений, которые могут быть сгеиерированы при открытии файла, относятся следующие: Агпиюепгкц11ехсерг1оп (указаио пустое имя файла), Агпцюепгехсерт1оп (указано неверное имя файла), АгяцюепгОцгОгпаппеехсерг1оп (указан неверный режим), яесцг1гуехсерг1оп (у пользователя иет прав доступа к файлу), Раглтооьопдехсерг1оп (слишком длинное имя файла или путь к нему), МотзцррогтебЕхсерс1оп (в имени файла где имя файла обозначает имя открываемого файла, включая полный путь к нему; а режим — порядок открытия файла.
В последнем случае указывается одно из значений, определяемых в перечислении Г11емобе и приведенных в табл. 14А. Как правило, этот конструктор открывает файл для доступа с целью чтения или записи. Исключением из этого правила служит открытие файла в режиме Г11емобе. Аррепб, когда файл становится доступным только для записи. 428 Часть (.
Язык О» указано устройство, которое ие поддерживается), а также 01тесСотуИОСГодпбЕхсерС1ОП (указан неверный каталог). Исключения Рас)ьтосьопдехсерс1оп, 01тессотухосгодпбехсерс1сп и Г11емосГодпбЕхсерС1оп относятся к подклассам класса исключений 10ЕхсерС1оп. Поэтому все оии могут быть перехвачены, если перехватывается исключение 10ЕхсерС1оп. Ниже в качестве примера приведен один из способов открытия файла севс. с(ас для ввода. Гь1еЯСтеав 11п) сту ( 11п = пен Гь1езттеав("тест", Г11емобе.орел); ) сато)ь(10ЕхсерС1оп ехс) ( // перехватить все исключения, // связанные с вводом-выводом Сопво1е.итьтеь»пе(ехс.мевваде)) // Обработать ошибку. ) сассп(ехсерсгоп ехс ( // перехватить любое другое исключение.
Сопво1е.ытстеЬ1пе(ехс.Мевваде)к // Обработать ошибку. ) В первом блоке сасс)ь из данного примера обрабатываются ошибки, возникающие в том случае, если файл ие найден, путь к нему слишком длинен, каталог ие существует, а также другие ошибки ввода-вывода. Во втором блоке сасс(т, который является "уии- версальиым" для всех остальных типов исключений, обрабатываются другие вероятные ошибки (возможио, даже путем повторного генерирования исключения). Кроме того, каждую ошибку можно проверять отдельно, уведомляя более подробно о ией и принимая конкретные меры по ее исправлению.
Ради простоты в примерах, представленных в этой книге, перехватывается только ис- ключение 10ЕхсерС1оп, ио в реальной программе, скорее всего, потребуется перехваты- вать и другие вероятные исключения, связанные с вводом-выводом, в зависимости от обстоятельств. Кроме того, в обработчиках исключений, приводимых в качестве примера в этой главе, просто уведомляется об ошибке, ио зачастую в иих должны быть запрог- раммироваиы конкретные меры по исправлению ошибок, если это вообще возможио. Например, можно предложить пользователю еще раз ввести имя файла, если указанный ранее файл ие был найден.
Как упоминалось выше, конструктор класса Гт1еястеав открывает файл, доступный для чтения или записи. Если же требуется ограничить доступ к файлу только для чтения или же только для записи, то в таком случае следует использовать конструктор Гь1езттеав(вттьпд имч файла, Гт1емобе режим, Гь1ейссевв способ) Как и прежде,имя файла обозначает имя открываемого файла, а режим — порядок открытия файла. В то же время способ обозначает конкретный способ доступа к файлу. В последнем случае указывается одно из значений, определяемых в перечислении Г11ейссевв и приведенных ниже.
Г11ейссевв.нт»те Г11ейссевв.аеас( Г11ейссевв.аеак)ытсте Например, в следующем примере кода файл открывается только для чтения: Гнева )4. Применение средств ввода-вывода 429 Г11езьсеащ Й1п = печ Г11езьгеащ("Сеэь.с(аь", 511еиоае.Орел, 511еассеээ.неаа); По завершении работы с файлом его следует закрыть, вызвав метод Р1оэе () .
Ниже приведена общая форма обращения к этому методу. чоьд С1ове () При закрытии файла высвобождаются системные ресурсы, распределенные для этого файла, что дает возможность использовать их для другого файла. Любопытно, что метод Р1оэе() вызывает, в свою очередь, метод Рйэроэе(), который, собственно, и высвобождает системные ресурсы. Помни) Оператор о кепд, рассматриваемый в главе 20, предоппавляет еще один способ закрытия файла, который больше не нужен. Такой способ оказывается удобным во многих случаях обращения с файлами, поскольку гаранглирует закрьалие ненужного больше файла простыми средппвоми.