Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 80
Текст из файла (страница 80)
Поэтому в некоторых программах состояние переполнения лучше проверять явным образом. ГЛАВА Применение средств ввода-вывода в примерах программ, приводившихся в предыдущих главах, уже применялись отдельные части системы ввода-вывода в С№, например метод со па о1е.
нг№сеЫпе Н, но делалось это без каких-либо формальных пояснений. Система ввода-вывода основана в С№ на иерархии классов, поэтому ее функции и особенности нельзя было представлять до тех пор, пока не были рассмотрены классы, наследование и исключения. А теперь пришел черед и для ввода-вывода. В языке С№ используется система ввода-вывода и классы, определенные в среде .НЕТ Егашев огх, и поэтому рассмотрение ввода-вывода в этом языке относится ко всей системе ввода-вывода среды .НЕТ в целом.
В этой главе речь пойдет о средствах консольного и файлового ввода-вывода. Следует, однако, сразу же предупредить, что система ввода-вывода в С№ довольно обширна. Поэтому в этой главе рассматриваются лишь самые важные и наиболее употребительные ее средства. Организация системы ввода- вывода в СФ на потоках Ввод-вывод в программах на С№ осуществляется посредством потоков. Поток — это некая абстракция производства или потребления информации. С физическим устройством поток связывает система ввода-вывода. Все потоки действуют одинаково — даже если они связаны с разными физическими устройствами. Поэтому классы и методы ввода-вывода могут применяться к самым разным типам устройств.
Например, методами вывода на консоль можно пользоваться и для вывода в файл на диске. Байтовые и символьные потоки На самом низком уровне ввод-вывод в С№ осуществляется байтами. И делается это потому, что многие устройства ориентированы на операции ввода-вывода отдельными байтами. Но человеку больше свойственно общаться символами. Напомним, что в С№ 418 Часть ), язык Сз тип с)тат является 16-разрядным, а тип Ьуге — 8-разрядным. Так, если в целях ввода- вывода используется набор символов в коде АБСП, то для преобразования типа спаг в тип Ьухе достаточно отбросить старший байт значения типа спаг. Но это не годится для набора символов в уникоде (11птсоде),' где символы требуется представлять двумя, а то и больше байтами. Следовательно, байтовые потоки не совсем подходят для организации ввода-вывода отдельными символами. С целью разрешить это затруднение в среде .НЕТ Ггашетчогк определено несколько классов, выполняющих превращение байтового потока в символьный с автоматическим преобразованием типа Ьуее в тип спаг и обратно.
Встроенные потоки Для всех программ, в которых используется пространство имен Яузсеаь доступны встроенные потоки, открывающиеся с помощью свойств Оопзо1е.1п, Сопзо1е.ОиС и Оопзо1е. Еггог. В частности, свойство Оопзо1е. Опт связано со стандартным потоком вывода. По умолчанию это поток вывода на консоль. Так, если вызывается метод Сопэо1е. Иг1СеЫпе О, информация автоматически передается свойству сопзо1е.
Оиг. Свойство Оопэо1е. гп связано со стандартным потоком ввода, который по умолчанию осуществляется с клавиатуры. А свойство Сопзо1е. Еггог связано со стандартным потоком сообщений об ошибках, которые по умолчанию также выводятся на консоль. Но эти потоки могут быть переадресованы на любое другое совместимое устройство ввода- вывода. Стандартные потоки являются символьными. Поэтому в зти потоки выводятся и из них вводятся символы. Классы потоков В среде .НЕТ Ггашетгог)т определены классы как для байтовых, так и для символьных потоков. Но на самом деле классы символьных потоков служат лишь оболочками для превращения заключенного в них байтового потока в символьный, автоматически выполняя любые требующиеся преобразования типов данных.
Следовательно, символьные потоки основываются на байтовых, хотя они и разделены логически. Основные классы потоков определены в пространстве имен Я уз Гем. 10. Для того чтобы воспользоваться этими классами, как правило, достаточно ввести приведенный ниже оператор в самом начале программы. изьод Яузсеп.гпт Пространство имен Яузгетс. 10 не указывается для консольного ввода-вывода потому, что для него определен класс Сопзо1е в пространстве имен яуэсегь КЛаСС ЗйгЕат Основным для потоков является класс Яузсеп. 10. Яггеаат.
Он представляет байтовый поток и является базовым для всех остальных классов потоков. Кроме того, он является абстрактным классом, а это означает, что получить экземпляр объекта класса Ясгеаат нельзя. В классе Яггеаат определяется ряд операций со стандартными потоками, представленных соответствующими методами. В табл. 14.1 перечислен ряд наиболее употребительных методов, определенных в классе яггеась Глава (4. Применение средств вводз-вывода 419 Таблица 14.1.
Некоторые методы, определенные в классе В с геат Описание иогс С1ояе () Ч01С Г1ияп() дпг яеасвуге() Закрывает поток Выводит содержимое потока на физическое устройство Возвращает целочисленное представление следующего байта, доступного для ввода нэ потока. Прн обнаружении конца файла возвращает значение -( Делает попытку ввести питвусея байтов в массив ьиг, начиная с элемента ьиг[оггяес). Возвращает количество успешно введенных байтов Ь Ь аеас(ьуге() Ьиу, 1пт оууяег, дпг питВугея) 1опс Зеек(1опс отсяек, Эеексггсгп оглади) Устанавливает текущее положение в потоке по указанному сме- щению оггяес относительно заданного начала отсчета оггд1п.
Возвращает новое положение в потоке Выводит один байт в поток вывода иодс Хгдиевуде(ЬУСе Ы чади Хг1пе (Ьуья [) Ьиу, 1пг сусле г, 1пд питзугея) Выводит подмножество и итлукяя байтов нз массива ьиг, на- чиная с элемента ьиг[ оггяес) . Возвращает количество выве- денных байтов Таблица 14.2. Свойства, определенные вклассе Вггеат Свойство Описание Ьоо1 Сапкеао Принимает значение схие, если иэ потока можно ввести данные. Доступно только для чтения Ьоо1 Сапзеек Принимает значение сгие, если поток поддерживает запрос текущего по- ложения в потоке.
Доступно только для чтения Ьоо1 Сапнг1ке Принимает значение сгие, если в поток можно вывести данные. Доступно только для чтения 1опд Ьепогп 1опс Роя111оп Содержит длину потока. Доступно только для чтения Представляет текущее положение в потоке. Доступно как для чтения, так н для записи 1пд Кеаот1теоиг Представляет продолжительность времени ожидания в операциях ввода.
Доступно как для чтения, так н для записи 1пк Хг1гет1теоик Представляет продолжительность времени ожидания в операциях вывода. Доступно как для чтения, так н для записи Ряд методов, перечисленных в табл. 14.1, генерирует исключение 1окхсерс1оп прн появлении ошибки ввода-вывода. Если же предпринимается попытка выполнить неверную операцию, например вывести данные в поток, предназначенный только для чтения, то генерируется исключение Нокэиррогкес(кхсеркдоп.
Кроме того, могут быть сгенернрованы н другие исключения — все зависит от конкретного метода. Следует заметить, что в классе Зкгеат определены методы для ввода (илн чтения) и вывода (или записи) данных. Но не все потоки поддерживают обе этн операции, поскольку поток можно открывать только для чтения илн только для записи. Кроме того, не все потоки поддерживают запрос текущего положения в потоке с помощью метода реек () . Для того чтобы определить возможности потока, придется воспользоваться одним, а то н несколькими свойствами класса зсгеат. Эти свойства перечислены в табл. 14.2 наряду со свойствами Вепеоьп и Роя1С1оп, содержащими длину потока н текущее положение в нем.
420 часть ). язык Сз Классы байтовых потоков Производными от класса Ясгеаш являются несколько конкретных классов байтовых потоков. Эти классы определены в пространстве имен Яузгет. 10 и перечислены ниже. Описание Класс потока Заключает в оболочку байтовый поток н добавляет буферизацию. Буферизация, как правило, повышает производительность Г11еЯСгеык Байтовый поток, предназначенный для файлового ввода-вывода МеасгуЯсгеят Байтовый поток, использующий память для хранения данных иппапаиедмепсгуясгеаи Байтовый поток, нспопьзуюимй неуправляемую память для хранения данных Виггегеизигеап В среде НЕТ Ггатешог)г поддерживается также ряд других конкретных классов потоков, в том числе для ввода-вывода в сжатые файлы, сокеты и каналы.
Кроме того, можно создать свои собственные производные классы потоков, хотя для подавляющего числа приложений достаточно и встроенных потоков. Классы-оболочки символьных потоков Таблица 14.3. Методы ввода, определенные в классе тежсвеас)ек Описание ьпС РееК() Получает следующий символ нз потока ввода, но не удаляет его. Возвращает значение -1, если нн один нз символов не доступен гпс веаг(() Возвращает целочисленное представление следующего доступ- ного символа нз вызывающего потока ввода.
Прн обнаружении конца потока возвращает значение -1 Делает попытку ввести количество пипслагя символов в массив ьие, начиная с элемента ьие(сееяес), н возвращает количе- ство успешно введенных символов Делает попытку ввести количество пипспагя символов в массив ьие, начиная с элемента ьие( сееяес), н возвращает количе- ство успешно введенных символов Вводит следующую текстовую строку н возвращает ее в виде объекта типа ясгзпв Прн попытке прочитать признак конца файла возвращает пустое значение Вводит все символы, оставшиеся в потоке, н возвращает нх в виде объекта типа ясг1пд гпг яеаг)(спас() Ьиг, Епи сЕЕяег, гпг пияСЛагя] ъпС Пеаив1сск(снах[! ЬиЕ, Епи сЕЕяег, ъпС пияСЛагя) ясг1пи яеаЖгпе() ягг1пд яеаг)тсвпг(() Для создания символьного потока достаточно заключить байтовый поток в одном из классов-оболочек символьных потоков.
На вершине иерархии классов символьных потоков находятся абстрактные классы Техгцеаоег и Техгнгъгег. Так, класс Техгцеаг)ег организует ввод, а класс Техгигъиег — вывод. Методы, определенные в обоих этих классах, доступны для всех их подклассов. Они образуют минимальный набор функций ввода-вывода, которыми должны обладать все символьные потоки. В табл. 14.3 перечислены методы ввода, определенные в классе техсцеас)ег.