Г. Шилдт - С#4.0 Полное руководство (1160795), страница 86
Текст из файла (страница 86)
/1 Простая сервисная программа ввода с диска и вывода нв экран, у( демонстрирующая применение класса Яггеашкеяг)ег. пауля Яуясеш) пя1пп Яуясеш.10; с1аяя Осоз ( ясвс1с Уогв Мауп() ( у11езсгвяш 11п) ясг1по я~ ггу ( 11п = пен Г11езсгеяш("Гевс.схс", Г11еноде.ореп); ) 452 Часть (. язык С() сатоь(10Ехсертгоп ехс) ( Сопяо1е .Хггтевьпе (" Ошибка открытия файха: 1п" + ехс .Меяяаэе); гетогп; ) Бтгеашяеябег Гятг гп = пеи Бтгеашяеаг(ег(тгп) гту ( иь11е((я = Гятг 1п.неаг(ьгпе()) != по11) ( Сопяо1е.нггтептпе(я); ) ) сатсь(10Ехсертгоп ехс) ( Сопяо1е.иггтеввпе("Ошибка яяода-вывода: 1п" + ехо.неяяаэе); ) Гтпа11у ( Гятг гп.С1ояе()( ) Обратите внимание на то, как в этой программе определяется конец файла. Когда метод Ееас)11пе () возвращает пустую ссылку, это означает, что достигнут конец файла.
Такой способ вполне работоспособен, но в классе Бтгеавнеаг)ег предоставляется еще одно средство для обнаружения конца потока — Епс(Огэтгеав. Это доступное для чтения свойство имеет логическое значение тгое, когда достигается конец потока, в противном случае — логическое значение Еа1яе. Следовательно, свойство Епт(01Бттеав можно использовать для отслеживания конца файла.
В качестве примера ниже представлен другой способ организации цикла ибг1е для чтения из файла. иь11е(!Гятг 1п.Епс(ОГБтгеаш) ( я = Гятг гп.реаб01пе(); Сопяо1е.игтте11пе(я)( ) В данном случае код немного упрощается благодаря свойству Епт(ОГБттеав, хотя общий порядок выполнения операции ввода из файла не меняется. Иногда такое применение свойства Епт(ОГБтгеав позволяет несколько упростить сложную ситуацию, внося ясность и улучшая структуру кода. Иногда файл проще открыть, используя непосредственно класс Бтгеавнеас(ет, аналогично классу Бтгеавнт1тет.
Для этой цели служит следуя)щий конструктор: Бггеашнеабег(ятгтпс путь) где путь — это имя открываемого файла, включая полный путь к нему. Указываемый файл должен существовать. В противном случае генерируется исключение Г11еиотГоопг(Ехсерт1оп. Если путь оказывается пустым, то генерируется исключение ))гоовептно11Ехсерт1оп. А если путь содержит пустую строку, то генерируется исключение))гоовептехсертгоп. Кроме того, могут быть сгенерированы исключения 10ехсерт1опи 01гестогумотеоипс)ехсерт1оп.
Переадресация стандартных потоков Как упоминалось ранее, стандартные потоки, например Сои яо1е . 1п, могут быть переадресованы. И чаще всего они переадресовываются в файл. Когда стандартный Глава 14. Применение средств ввода-вывода 453 поток переадресовывается, то вводимые или выводимые данные направлякзтся в новый поток в обход устройств, используемых по умолчанию. Благодаря переадресации стандартных потоков в программе может быть организован ввод команд из дискового файла, создание файлов журнала регистрации и даже чтение входных данных из сетевого соединения. Переадресация стандартных потоков достигается двумя способами.
Прежде всего, это делается при выполнении программы из командной строки с помощью операторов < и >, переадресовывающих потоки Сап я о1е . 1п и Сап яо1е. Опа соответственно. Допустим, что имеется следующая программа. пя1пч 5уягегн а1аяя теяг ( ягагьа по1б Ма1п() ( Сопяо1е.нг1ае11пе(пэта теат."); ) ) Если выполнить эту программу из командной строки 'Хеяс > 1оя то символьная строка "Эта тест. " будет выведена в файл 1аср Аналогичным образом переадресуется ввод. Но для переадресации ввода указываемый источник входных данных должен удовлетворять требованиям программы, иначе она "зависнет".
Операторы < и >, выполняющие переадресацию из командной строки, не являются составной частью С)), а предоставляются операционной системой. Поэтому если в рабочей среде поддерживается переадресация ввода-вывода, как, например, в УУ)пг)оьуа, то стандартные потоки ввода и вывода можно переадресовать, не внося никаких изменений в программу. Тем не менее существует другой способ, позволяющий осуществлять переадресацию стандартных потоков под управлением самой программы. Для этого служат приведенные ниже методы Бес1п (), Бесопс () и Бесеггог (), являющиеся членами класса Сопяа1е. яааага поыд Беа1п(техареабег новый поток ввода) ягаг1а по1п Бегопг(техгнгьгег новый поток вывода) ягагга погд Бегкггог(техгигггег новый поток сообщений об оынбках) Таким образом, для переадресации ввода вызывается метод Беа1п () с указанием требуемого потока.
С этой целью может быть использован любой поток ввода, при условии, что он является производным от класса техскеас(е г. А для переадресации вывода вызывается метод Бесопг () с указанием требуемого потока вывода, который должен быть также производным от класса уеханеаг(ег. Так, для переадресации вывода в файл достаточно указать объект класса Ег 1еБС геаач заключенный в оболочку класса Бсгеаынгдгег. Соответствующий пример программы приведен ниже. Переадресовать поток сопяо1е.опг. пя1пс Буяаев; пя1пд 5уяаепп 1ог а1ааа Веб1геаа ( яааа1а нога Мага() ( Багеаанг1аег 1оч апа = пп11; 454 Часть (. Язык С(г ггу ( 1од оцс = пеи Зсгеашиггсег("1одт11е.схс"]; О переадресовать стандартный вывод в файл 1очШе.схс.
Сопао1е.зесоцс(1оч оцс); Сопво1е.игьсеьапе("Это начало файла журнала регистрации."); Гог(апг 1=0( 1<10; ть+) Сопво1е.иг1сеьапе(1)," Сопво1е.ыггсеЬ1пе("Это конец файла журнала регистрации.")) ) сагой(1ОЕхсерсгоп ехс) ( Сопво1е.игьсеьдпе("Ошибка ввода-выводаМ" + ехс.мевваде); 11па11у ( 15(1од оцт != пц11) 1оэ оцГ.С1ове(); ) ) ) При выполнении этой программы на экран ничего не выводится, но файл 1 од 111 е .
гхс будет содержать следующее. Это начало файла журнала регистрации. 0 1 2 3 5 б 7 8 9 Это конец файла журнала регистрации. Попробуйте сами поупражняться в переадресации других встроенных потоков. Чтение и запись двоичных данных В приведенных ранее примерах демонстрировались возможности чтения и записи байтов или символов. Но ведь имеется также возможность (и ею пользуются часто) читать и записывать другие типы данных. Например, можно создать файл, содержащий данные типа 1пс, с)оц)71е или в)тогс.
Для чтения и записи двоичных значений встроенных в С() типов данных служат классы потоков В1пагунеаг)ег и В1пагуИгзсег. Используя эти потоки, следует иметь в виду, что данные считываются и записываются во внутреннем двоичном формате, а не в удобочитаемой текстовой форме. Класс Взлзатут)тгЫег Класс В1пагуиг1тег служит оболочкой, в которую заключается байтовый поток, управляющий выводом двоичных данных. Ниже приведен наиболее часто употребляемый конструктор этого класса: Глава 14. Применение средств ввода-вывода 455 Вгпагуигггег (яггеае си григ) таблица 14.5. наиболее часто используемые методы, определенные в классе В1пагуиг1ьег Метод Описание чо1с) чо1с( чо1г( чоус( Иг1се (ВЬусе та1ие) (Ьусе ча1ие) (Ьусе[) ЬиГГег) (япогс ча1ие) Записывает значение типа яЬуге со знаком Записывает значение типа Ьуге без знака Записывает массив значений типа ьуге Записывает целочисленное значение типа яцогг (корсткое целое) Записывает целочисленное значение типа ияьогг (короткое целое без знака) Записывает целочисленное значение типа 1пг Записывает целочисленное значение типа и1пг (целое без знака) Записывает целочисленное значение типа 1опс (длинное целое) Записывает целочисленное значение типа и1опс (длинное целое без знака) Записывает значение типа 11оаг (с плавающей точкой одинарной точности) Записывает значение типа г(оиЬ1е (с плавающей точкой двойной точности) Записывает значение типа с(еснпа1 (с двумя де- сятичными разрядами после запятой) Записывает символ Записывает массив символов Записывает строковое значение типа ягг1пи, представленное во внутреннем формате с указа- нием длины строки Иг1се Иг1се Иг1се чо1с( Иг1се (ияЛогс ча1ие) чо1 с) чо1г( Иг1се Иг1се (1пг ча1ие) (и1пг ча1ие) чо1г) Хггае (1опс ча1ие) чо1с) Игзсе (и1опи ча1ие) чо1г) Игусе(11оас ча1ие) чо1с( Иг1се(г)оиЬ1е ча1ие) чо1г) Иг1се(с(ес1иа1 ча1ие) чо1г( чо1с( Иг1се Хг1се (спаг сЬ) (спаг[] ЬиГгег) (ясг1пс ча1ие) чо1г) Иг1се Класс ВзлаеуйеасТет Класс в1пагунеас(ег служит оболочкой, в которую заключается байтовый поток, управляющий вводом двоичных данных.
Ниже приведен наиболее часто употребляемый конструктор этого класса: где си григ обозначает поток, в который выводятся записываемые данные. Для записи в выходной файл в качестве параметра о и григ может быть указан объект, создаваемый средствами класса Г11еэггеаьь Если же параметр о и григ оказывается пустым, то генерируется исключение дгдитепсни11Ехсерсзоп. А если поток, определяемый параметром о и григ, не был открыт для записи данных, то генерируется исключение дгдивепГЕхсерсзоп. По завершении вывода в поток типа ВгпагуХг1сег его нужно закрыть.
При этом закрывается и базовый поток. В классе Взпагунг1сег определены методы, предназначенные для записи данных всех встроенных в СФ типов. Некоторые из этих методов перечислены в табл. 14.5. Обратите внимание на то, по строковые данные типа ясг1пс записываются во внутреннем формате с указанием длины проки. Кроме того, в классе Вупагунг1се г определены стандартные методы С1ояе () и Г1ияЬ (), действующие аналогично описанному выше. 456 Часть (. Язык С() Вгпагуяеабег (Бсгеяп гприг) Таблица 14.6. Наиболее часто используемые методы, определенные в классе В1пвгуйеабег Метод Описание Ьоо1 Ееабвоо1еап() Ьуге Веабвуге() яЬуге ЕеабБВуге() Ьусе() КеабВугея(1пг соипс) Считывает значение логического типа Ьоо1 Считывает значение типа Ьуге Считывает значение типа яЬуге Считывает количество соил с байтов и возвраща- ет их в виде массива Считывает значение типа спас Считывает количество соип с символов и возвра- щает их в виде массива Считывает значение типа бес1гла1 Считывает значение типа боибуе Считывает значение типа 11оаг Считывает значение типа япогг Считывает значение типа 1пг Считывает значение типа 1опд Считывает значение типа ияьогс Считывает значение типа идпг Считывает значение типа и1опо Считывает значение типа ясггпо, представлен- ное во внутреннем двоичном формате с указани- ем длины строки.
Этот метод следует использовать для считывания строки, которая бьиа записана средствами класса Вупагунгьсег спаг ВеабСЬаг() спаг() Реас)СЬагя(1пг соипг) бесдыа1 Веабпесьиа1() боибуе ВеабпоиЬ1е() 11оаг Ееаб51по1е() япогс Веаб1пс16() 1пг Веаб1пг32() 1опо Ееаб1пгб4() ияпогг Веаб01пс16() иьпг Ееаб01пг32() и1опо Ееаб01пгб4() ягг1по Веаббгг1по() В классе Вгпа гунгдге г определены также три приведенных ниже варианта метода Реас(() .