Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 85
Текст из файла (страница 85)
Для чтения и записи двоичных значений встроенных в С№ типов данных служат классы потоков Вфпагупеайег и Вфпагуиг1Сег. Используя эти потоки, следует иметь в виду, что данные считываются и записываются во внутреннем двоичном формате, а не в удобочитаемой текстовой форме. Класс Въиаюумт~~еа Класс н1пагунгфсег служит оболочкой, в которую заключается байтовый поток, управляющий выводом двоичных данных.
Ниже приведен наиболее часто употребляемый конструктор этого класса. 81пагуиг1гег (зсгевш поток вывода) где поток вывода обозначает поток, в который выводятся записываемые данные. Для записи в выходной файл в качестве параметра поток вывода может быть указан объект, создаваемый средствами класса р11езсгеюв. Если поток вывода оказывается пустым, то генерируется исключение йгдцшепбиц11нхсерС1ОП. А если поток вывода не был открыт для записи данных, то генерируется исключение йг1)цшепгнхсерг1ОП. 440 часть ), язык с№ В классе Вгпагуигг ге г определены методы, предназначенные для записи данных всех встроенных в С№ типов.
Некоторые из этих методов перечислены в табл. 14.5. Обратите внимание на то, что строковые данные типа ягг1пп записываются во внутреннем формате с указанием длины строки. Кроме того, в классе В1пагуиггйег определены стандартные методы с1ояе () и Г1цяй (), действующие аналогично описанному выше. Таблица 14.б. Наиболее употребительные методы, опруделениые в классе В1пагунг1сег Метод Описание чогк) иг1ге (яьуге кв1) Записывает значение типа яъусе со знаком чагс Иггсе (Ьусе ка1) Записывает значение типа ьуге без знака чогк( иг1ге (ьусе [] Ьпг) записывает массив значений типа ьуге чоха иггге (яйогг та1) записывает целочисленное значение типа яйогг (короткое целое) чоха Иггсе(ияйогс ка1) чо1к) иггге(11оаг та1) чогс Иг1се [Поийге ка1) но1П Иггсе(сйаг ка1) Записывает символ чо1к) иг1ге (сйаг [] Ьиг) Записывает массив символов тоьб Иг1се(ясггпс ка1) Класс Вллагуйеайег Класс в1пагунеаг[ег служит оболочкой, в которую заключается байтовый поток, управляющий вводом двоичных данных.
Ниже приведен наиболее часто употребляемый конструктор этого класса. В1пагупеяк)ег(зсгеаи поток ввода) где поток ввода обозначает поток, из которого вводятся считываемые данные. Для чтения из входного файла в качестве параметра поток ввода может быть указан объект, создаваемый средствами класса у11еясгеаьг Если поток ввода не был открыт для чтения данных или оказался недоступным по иным причинам, то генерируется исключение Агдппепйкхсерй1оп.
В классе В1пагунеаг)ег определены методы, предназначенные для чтения данных всех встроенных в С№ типов. Некоторые из этих методов перечислены в табл. 14.6. Следует, однако, иметь в виду, что в методе Веаг[зсг1пя () считывается строка, хранящаяся во чогк( Иггсе(гпс ка1) чо1к) Иггсе(цгпс ка1) тога иггге(1опо та1) чо1к) Иггсе(и1опс кв1) Записывает целочисленное значение типа ияйогг (короткое целое без знака) Записывает целочисленное значение типа гпг ЗаПИСЫВаЕт ЦЕЛОЧИСЛЕННОЕ ЗНаЧЕНИЕ тИПа п1пс (ЦЕЛОЕ бвя ЗНаКа) Записывает целочисленное значение типа 1опд (длинное целое) Записывает целочисленное значение типа пгопч (длинное целое без знака) Записывает значение типа ноас (с плавающей точкой одинарной точности) Записывает значение типа попьге (с плавающей точкой двойной точности) Записывает строковое значение типа ягггпгъ ПРЕДСтавлЕнное ео внутреннем формате с указанием длины строки Глава 14.
Применение средств ввода-внвода 441 внутреннем формате с указанием ее длины. Все методы данного класса генерируют ис- ключение 1СВхсерсуоп, если возникает ошибка ввода. Кроме того, могут быть сгенери- рованы и другие исключения. Таблица 14.6. Наиболее употребительные метода(, определенные а классе В1пакунеас)ек Описание Ьоо1 Кеес(ноо1еап() ьусе кеес(нусе() яьу1е аеас(януса() Считывает значение логического типа ьоо1 Считывает значение типа ьусе Считывает значение типа яьусе ьусе[] аеас(вусея (1пс пои) считывает количество ппт байтов и возвращает их в виде массива снях Кеаоопаг() Считывает значение типа сьаг сьяг [] нвяосьягя (1пс пои) Считывает количество пшп символов и возвращает их в виде массива В классе Вдпагунгуьег ОПРеделены также тРи пРиведенных ниже ваРианта метода неас( () .
Метод Описание хпС Неас1() дпс неяс)(ьусе(] ьцг делает попытку прочитать количество пои байтов в массив ьод на1пс оугяяс, зпс пия) чиная с элемента ьиг[оггяяс], и возвращает количество успешно считанных байтов зпс неяс((спас [] юг, делает попытку прочитать количество пикс символов в массив ьид 1пс оггяес, 1пс поя) начиная с элемента ьпг(оггяяс), и возвращает количество успешно считанных символов При неудачном исходе операции чтения эти методы генерируют исключение 10ехсерс1оп.
Кроме того, в классе В1пагунг1сег определен стандартный метод С1ояе () . Соиьге НеяоооиЬ1е () Е1оаС Неанэзпд1е() яьогС аеас)тпС16() зпС Неяс(1пС32() 1опп аеас(1пС64() ияьосС Неасю1пС16() сдпС Неасш1пС32 () и1опо аеас)С1пС64() яСгзпо Неаббьг1пды Считывает значение типа с(оиь1е Считывает значение типа 11оас Считывает значение типа яьогс Считывает значение типа зпс Считывает значение типа 1опд Считывает значение типа ояьогс. Считывает значение типа пдпс Считывает значение типа о1опст Считывает значение типа ясс1пщ ПРЕДСтаВЛЕнноЕ во внутрЕн- нем двоичном формате с указанием длины строки.
Этот метод следует испольэовать для считывания строки, которая была за- писана средствами класса н1пагунс1сес Возвращает целочисленное представление следующего доступного символа из вызывающего потока ввода. При обнаружении конца фай- ла возвращает значение -1 442 Часть (. Язык С» Демонстрирование двоичного ввода-вывода Ниже приведен пример программы, в котором демонстрируется применение классов В1пагуиеабег и Вфпагуигфгег для двоичного ввода-вывода. В этой программе в файл записываются и считываются обратно данные самых разных типов.
// Записать двоичные данные, а затем считать их обратно. пя1пд Буяпепп пя1пд яуясеш.тот с1аяя Еиоака ( ясак»с чогб мвтп() ( В1пагуиг1гег багаопьт Вгпагуаеабег бапатпт гпг 1 10) ЕОпЬ1е б = 1023.567 Ьоо1 Ь = Споет яггтпд ягг = "Зто тест"; спу ( багаопь = пен В1пагуиг1сег(пен Е11езсгеаш("сеяьааса", р11емобе.сгеасе))т сагсп(1ОЕхсерг1оп ехс) ( Сопяо1е.Иг1геп»пе("Ие удается открыть файл для вывода")т Сопяо1е.иг1гепгпе(ехс.Мезяаде); геспгпт ) // Записать данные в файл.
сгу ( Сопяо1е.Иг1гет»пе("Запись " + 1); басаопс.иггсе(1)7 Сопяо1е.игггептпе("Запись " + б); басаопс.иг1се(б)т Сопяо1е.Иг1ге11пе("Запись " ь Ь)' г(апаопп.иг1ге(Ь)г Сопяо1е.Иг1кесгпе("Запись " + 12.2 * 7.4)г багаопг.иг1ге(12.2 * 7.4)т Сопяо1е.игасеп»пе("Запись " Я япг)г басаопс.из»се(ясг)т сапсЬ(1ОЕхсерптоп ехс) ( Сопяо1е.игтсепапе("Ошибка записи в файл"); Сопяо1е.иггкесгпе(ехс.иеяяаде)т ) басаопГ.С1ове()т Сопзо1е.иг1геЬ1пе() // а теперь считать данные. ггу ( бага1п = пен В1пагуаеабег(пен У11езсгеаш("Гевсбаса", Е11еиобе.ореп))т сагсп(10Ехсерс1оп ехс) ( Сопяо1е.иг1се11пе("Не удается открыть файл для ввода"); Сопяо1е.Иг1сесгпе(ехс.меззаое)т гесигпт ггу ( 1 = баса1п.аеаб1пс32()т Сопво1е.иг1сеЬ1пе("Чтение " + 1); б = баса1п.аеабпопЬ1е(); Сопво1е.Иггсетапе("Чтение " + б); Ь = баса1п.иеабВоо1еап(): Сопво1е.иг1гет апе ( "Чтение " т Ь) т б = баса1п.аеабпопЬ1е()т Сопяо1е.иг1ге11пе("Чтение " в б)т вгг = бага1п.аеабзгг1пч() т Сопяо1е.Игггетапе("Чтение " т зсг)т ) сассп(10Ехсерсгоп ехс) ( Сопяо1е.иггсе11пе("Ошибка чтения ив файла" ); Сопяо1е.иггсеЬгпе(ехс.Мевяасе)т баса1п.
С1ове (); ) ) Вот к какому результату приводит выполнение этой программы: Запись Запись Запись Запись Запись Чтение Чтение Чтение Чтение Чтение 10 1023.56 Тгпе 90.28 Зто тест 10 1023.56 Тгпе 90.28 Зто тест Глава 14. Применение средств ввода-вывода 443 444 Часть!, язык С» Если просмотреть содержимое файла севсбаса, который получается при выполнении атой программы, то можно обнаружить„что ои содержит данные в двоичной, а ие в удобочитаемой текстовой форме. Далее следует более практический пример, демонстрирующий, насколько зффективиым может быть двоичный ввод-вывод. Для учета каждого предмета хранения иа складе в приведенной ниже программе сначала запоминается наименование предмета, имеющееся в наличии, количество и стоимость, а затем пользователю предлагается ввести наименование предмета, чтобы найти его в базе данных, Если предмет найден, отображаются сведения о его запасах иа складе.
/* Использовать классы 81пагуаеабег и Вгпагуигггег для реализации простой программы учета товарных запасов. */ ця1пч Зуягелц ця1пч зуягею.ГО; с1аяя гпъ.епгогу ( ягаггс чогб Ма1п() ( В1пагуиггсег басаоцст В1пагуаеабег багагпт ягг1пп бгет; // наименование предмета 1пС опнапгй // имеющееся в наличии количество боцю1е сояст // цена сгу ( багаоцг = пен В1пагуигггег(пен 811езггеае("гпчепгогу.баг", Г11еиобе.сгеаге))т сагсн(ГОВхсерг1оп ехс) ( Сопяо1е.иггге( впе("Не удается открыть файл " + "товарных запасов для вывода"); Сопяо1е.Иг1гепьпе(ехс.иеяяаде)т гегцгп) ) // Записать данные о товарных запасах в файл. сгу ( багаоцг.иг1ге("Молотки")т багасцг.иггСе(18)т басаоцг.иг1се(3.95)т багаоцС.Иггге("Отвертки")т басаоцс.иг1се(18)т багаоцС.Иггге(1.50)т басаоцс.иггсе("плоскогубцы")г багаоцС.Иггге(5)т басаоцс.иггсе(4.95)т багаоцС.Иггге("Пилы")т багаоцг.иггге(8)т Глава )4.
Применение средств ввода-вывода 446 баСабпС.ИгаСе(Я.ЯЯ)) ) сагой (1ОЕхсергаоп ехс) ( Сопяо1е.шгагесапе("Ошибка записи в файл товарных запасов" ); Сопяо1е.игаге11пе(ехс.Меняле)т ) багабпС.С1ояе()т Сопяо1е.шг1сеЕ1пе()т // й теперь открыть файл товарных запасов // для чтения. сгу ( бага1п = пен В1пагунеабег(пен у11еясгеаш("1пчепсогу.бас", У11емобе.брел)); сагсЬ(1ОЕхсергаоп ехс) ( Сопяо1е.ИгасеВапе("Не удается открыть файл " + "товарных запасов для ввода"); Сопяо1е.ыг1ге11пе(ехс.меяяаое)) гегогп; // Найти предмет, введенный пользователем.
Сопяо1е.шг1Се("Введите наименование для поиска: "); ягг1пд илаг = Сопяо1е.аеабс1пе()т Сопяо1е.шг1Сесспе()) сгу ( Гог(тт) ( // Читать данные о предмете хранения. асею = баса1п.неабясг1пч()т опйапб = с)аса1п.аеаб1пС32()т сояг = баса1п .НеабВопЬ1е () т // Проверить, совпадает ли он с запрашиваемым // предметом. Если совпадает, то отобразить // сведения о нем. 11(1Сеш.сошрагето(ннаг) == О) ( сопяо1е.иг1сеьапе(гсеш + ": " + опнапб + " штук в наличии. "Цена: (О:С) за штуку", сояг); сопяо1е.иг1сееапе("Общая стоимость по " + "наименованию <(О)>: (1:С).", асею, сояс * опйапб)) Ьгеант ) ) ) сагой(ЕпбОГЯСгеашЕхсергаоп) ( Сопяо1е.иг1се11пе("Предмет не найден."); ) 446 часть ), язык Сз сассл (1ОЕхсерсгоп ехс) ( Сопзо1е.игггеЬгпе("Ошибка чтения из файла товарных запасов" ) Сопзо1е.иггсеЬгпе(ехс.иеззаче)) ) басагп.С1озе()7 Выполнение этой программы может привести, например, к следующему результату: Введите наименование для поиска: Отвертки Отвертки: 18 штук в наличии.
Цена: 51.50 за штуку. Общая стоимость по наименованию <Отвертки>: 027.00. Обратите внимание иа то, что сведения о товарных запасах сохраняются в этой программе в двоичном формате, а ие в удобной для чтения текстовой форме. Благодаря этому обработка числовых данных может выполняться без предварительного их преобразования из текстовой формы. Обратите также внимание на то, как в этой программе обнаруживается конец файла. Методы двоичного ввода генерируют исключение ЕпбОГЯСгеащкхсергаоп по достижении конца потока, и поэтому файл читается до тех пор, пока не будет найден искомый предмет или сгенерировано данное исключение.