Г. Шилдт - С#4.0 Полное руководство (1160795), страница 87
Текст из файла (страница 87)
При неудачном исходе операции чтения эти методы генерируют исключение 10Ехсергдоп. Кроме того, в классе В1пагунеабе г определен стандартный метод С1ояе () . где дори с обозначает поток, из которого вводятся считываемые данные. Для чтения из входного файла в качестве параметра 1прис может быть указан объект, создаваемый средствами класса Р11еБСгеааь Если же поток, определяемый параметром борис, не был открыт для чтения данных или оказался недоступным по иным причинам, то генерируется исключение АгоитепСЕхсерг1оп. По завершении ввода из потока типа Вдпагунеабег его нужно закрыть. При этом закрывается и базовый поток.
В классе Вдпагунеабег определены методы, предназначенные для чтения данных всех встроенных в СФ типов. Некоторые из этих методов перечислены в табл. 14.6. Следует, однако, иметь в виду, что в методе Веаббгг1пп () считывается символьная строка, хранящаяся во внутреннем формате с указанием ее длины. Все методы данного класса генерируют исключение 10Ехсергдоп, если возникает ошибка ввода. Кроме того, могут быть сгенерированы и другие исключения. Глава 14. Применение средств ввода-вывода 457 Описание Метод 1пг Веаг) () Возвращает целочисленное представление следующего доступного символа из вызывающего потока ввода. При обнаружении конца файла возвращает значение -1 упг Веаг((ьусе[] ьиггег, Делает попытку прочитать количество соипс байтов в дпб оггяес, 1пС соопс) МаССив ЬпЕ1ег, НачинаЯ с элемента ЬиЕГег[оГГяег], и возвращает количество успешно считанных байтов 1пс Веас((сьаг[]ьитГег, делает попытку прочитать количество соиле символов дпь оГиег, Впг согпг) вмассивьиГГег,начинаясэлементаьпгйег[отйяег], и возвращает количество успешно считанных символов Ае(ионстрирование двоичного ввода-вывода Ниже приведен пример программы, в котором демонстрируется применение классов Вш пагуйеабег и В1п ах унгдг ел для двоичного ввода-вывода.
В этой программе в файл записываются и считываются обратно данные самых разных типов. Записать двоичные данные, а затем считать их обратно. иятпд Яуягеш; оя1пд Буясеш.10; с1аяя Риоаса ясастс чоха Мати() ВтпагуХгтсег Оасаопс) Вупагувеабег Оаса1п; 1пс ' = 10; ОооЬ1е О = 1023.5В1 Ьоо1 Ь = Ггие; ясг1пч ясг = "Это тест"; Открыть файл длл вывода. ггу ( Оасаопс = пен Втпагухгьгег(лен г11езггеаш("геягоага", Р11емоое.сгеаге)); Сассь(10Ехсерстоп ехс) ( Сопяо1е.игхсе11пе("Ошибка открытия файла: 1п" + ехс.незвале) ГЕГНГП2 ) Записать данные в файл. ггу ( Сопяо1е.иг1сеьгпе("Запись " е 1); Оасаосл.иг1се(х) 1 Сопяо1е.игтсенспе("Запись " + Ф; ОасаОпс.нгтсе(О); Сопяо1е.игтсеьапе("Запись " + Ы; Оасаоис.игтсе(Ы; 488 Часть!.
Язык С№ сопяо1е.игтгеьтпе("запись " ь 12.2 * 7.4)г бакаопк.игтсе[12.2 * 7.4); Сопяо1е.игтсеЬ1пе("Запись " т ясг)т багаопг.игтсе(ясг)) ) сасск(10Ехсерс1оп ехс) ( сопяо1е.иг1геьтпе("Ошибка ввода-выводат1п" + ехс.меяяаче); ) 11па11у ( багаопс. С1ове () т ) Сопяо1е.иггсеХгпе()т !/ А теперь прочитать данные иэ файна. ггу ( бага1п = пен Вгпагукеабег (пен Г11еЕГгеаш (Усеясбаса", Р11еМобе .Ореп) ) т ) сассь(10Ехсерг1оп ехс) ( Сопяо1е.ыгтсе01пе("Ошибка открытия файна:1п" + ехс.неяяасе)т гегпгп; ) ггу ( г баса1п.кеаб1пс32()т Сопяо1е.игтге01пе("Чтение " + г)т б г)ака1п.кеабОоиЬ1е()т Сопяо1е.иггсеа№пе("Чтение " + б)г Ь = Оаса1п.аеас(Воо1еап()) Сопяо1е.игтсе01пе("Чтение " + Ь); б = г)аса1п.аеаг)ОопЬ1е()г Сопяо1е.ыггсепфпе("Чтение " + г))т якг = г)аса1п.кеабзсгтпЧ()т Сопяо1е.ыгтсеьтпе("Чтение " + ясг); ) сагсь(10ехсергтоп ехс) ( Сопяо1е.игтсеьтпе("Ошибка ввода-вывода:~п" + ехс.Меяяасе); ) 11па11у ( г)ака1п.С1ояе () т ) ) Вот к какому результату приводит выполнение этой программы.
Запись 10 Запись 1023.56 Запись Тгие Запись 90.28 Запись Зто тест Глава 14. Применение средств ввода-вывода 459 Чтение 10 Чтение 1023.56 Чтение тгце Чтение 90.28 Чтение Зто тест Если просмотреть содержимое файла Сеягбага, который получается при выполнении этой программы, то можно обнаружить, что он содержит данные в двоичной, а не в удобочитаемой текстовой форме. Далее следует более практический пример, демонстрирующий, насколько эффективным может быть двоичный ввод-вывод.
Для учета каждого предмета хранения на складе в приведенной ниже программе сначала запоминается наименование предмета, имеющееся в наличии, количество и стоимость, а затем пользователю предлагается ввести наименование предмета, чтобы найти его в базе данных. Если предмет найден, отображаются сведения о его запасах на складе. /* Использовать классы Вгпагувеабег и ВгпагуХггпег для реализации простой програмьы учета товарных запасов. */ ця1пч Вуягеаи ця1пч Вуясев.10; с1аяя 1пчепсогу ( ясаГ1с чо1б Магп() ( Вгпагунггсег басаоцс1 81пагуКеадег баса1п; ясгтпч гсеаи О наименование предмета ьпс опнапб; // имегыееся в наличии количество боцЬ1е сояс; // цена сгу ( басаоьа = пен Вгпагухгггег (пен Г11езггеаы ("1пнепсогу.бас", 811емобе .сгеаге) ) ) сагсп(10ехсерг1оп ехс) ( Сопяо1е.нгтсеьгпе("Не удается открыть файл "товарных запасов для вывода" )) Сопяо1е.иг1геьгпе("Причина: " + ехс.неяяасе); гегцгп; ) // Записать данные о товарных запасах в файл.
агу ( с)асаоца.нгьсе("Мелодики"); багаоцГ.Хггсе(10); багаоцг.хггге(3.95) 1 басаоцс.нгьсе("Отвертки" ) 1 басаоцс.иггсе(18); багаоцг .Иг1ге (1 . 50) 1 багаоцс.нгбсе("Плоскогубцы"); басаоцс.нггсе(5); 460 Часть (. Язык С() ба с або с . Хгфсе (4 .
95); басабос.кг1те("Пилы" ); басабос .Иггсе (8) ( басабпЬ.Иг1се(Б. 95); сассЬ(1ОЕхсерг1оп ехс) ( Сопяо1е.кггсеьяпе("Ошибка записи в файл товарных запасов"); Сопяо1е.иг1оеь1пе("Причина: " + ехс.меяяаде); ) 11па11у ( басабпЬ.С1ояе(); ) Сопяо1е.иггсеьфпе(); )) теперь открыть файл товарных запасов для чтения. Ьгу ( бага1п = пен В1пагуйеабег(пен Е11езсгеаш("1пчепсогу.бас", Г11еМобе.бреп)) ) сассЬ(1ОЕхсерсфоп ехс) Сопяо1е.нгбгеьфпе("Не удается открыть файл "товарных запасов для ввода"); Сопяо1е.иггсе11пе("Причина: " + ехс.меяяафе); гегогп; // Найти предмет, введенный пользователем.
Сопяо1е.Хгфге("Введите наименование длл поиска: ") яогфпЧ ньас = Сопяо1е.йеабьгпе()) Сопяо1е.нггсеьфпе()) Ьгу ( 1ог(;;) ( // Читать данные о предмете хранения. Есеш = бата1п.йеабзсг1ЬЧ(); опЬапб = баса1п.Реаб1пс32(); сояг = бага1п.йеаббооЬ1е(): // Проверить, совпадает ли он с запрашиваеьым предметом. // Если совпадает, то отобразить сведения о нем. 11(1сеш.ЕЧпа1я(ХЬас, Бсг1пЧСошраггяоп.бгбфпа119погеСаяе)) ( сопзо1е.хг1геьзпе(ггеш + ": " + опЬапб + " штук в наличии. "цена: (О:С) за штуку", сояс)) Сопяо1е.игзсе1гпе("Обшая стоимость по наиыенованию <(0)>: (1:С).' 1сеш, сояс * опЬапб); Ьгеакы ) ) ) сассЬ(Епб01БГгеашЕхсерс1оп) ( Сопяо1е.иг1теьфпе("Предмет не найден."); ) Г(ава 14. Применение средств ввода-вывода 461 сатсь (1ОЕхсергдоп ехс) ( Сопзо1е.нтьсевлпе (" Ошибка чтения из файла товарных запасов") Сопзо1е.нг11е11пе("Причина: " + ехс.иеззаде); 11па11у ( Оапа1п. 01оае (); ) ) Выполнение этой программы может привести, например, к следующему результату.
Введите наименование дпя поиска: Отвертки Отвертки: 18 штук в наличии. Цена. "51.80 за штуку. Обшая стоимость по наименованию <Отвертки>с 527.00. Обратите внимание на то, что сведения о товарных запасах сохраняются в этой программе в двоичном формате, а не в удобной для чтения текстовой форме. Благодаря этому обработка числовых данных моясет выполняться без предварительного их преобразования из текстовой формы.
Обратите также внимание на то, как в этой программе обнаруживается конец файла. Методы двоичного ввода генерируют исключение Епс(ОГЯСгеашЕхсерб1оп по достижении конца потока, и поэтому файл читается до тех пор, пока не будет найден искомый предмет или сгенерировано данное исключение. Таким образом, для обнаружения конца файла никакого специального механизма не требуется. файлы с произвольным доступом В предыдущих примерах использовались последовательные файлы, т.е. файлы со строго линейным доступом, байт за байтом.
Но доступ к содержимому файла может быть и произвольным. Для этого служит, в частности, метод Беек (), определенный в классе Е11еБС геаш. Этот метод позволяет установить указатель положения в файле, или так называемый ухюатель фаила, на любое место в файле. Ниже приведена общая форма метода Беек (): 1опд Беек(1опд огезее, Беехотгдгп ое1длп) где Обвес обозначает новое положение указателя файла в байтах относительно за- данного начала отсчета (отйдйп). В качестве отдд1 и может быть указано одно из при- веденных ниже значений, определяемых в перечислении ЯеекОг1д1п. Описание Значение Бееког1д1п.нед1п ЯееХОг1ддп.Опггепп БееХОгйдс О.Епс) Поиск от начала файла Поиск от текущего положения Поиск ог конца файла Следующая операция чтения или записи после вызова метода Яее)с () будет выполняться, начиная с нового положения в файле, возвращаемого этим методом. Если во время поиска в файле возникает ошибка, то генерируется исключение 10Ехсергдоп.
Если же запрос положения в файле не поддерживается базовым потоком, то генерируется исключение носЯпррогсес(Ехсерс1оп. Кроме того, могут быть сгенерированы и другие исключения. 462 Часть ). Язык С() В приведенном ниже примере программы демонстрируется ввод-вывод в файл с произвольным доступом.
Сначала в файл записываются прописные буквы английского алфавита, а затем его содержимое считывается обратно в произвольном порядке. // Продемонстрировать произвольный доступ к файлу. пя1пц Яуясет; пя1пс Яуяпеи.10! с1аяя йапдопйссеяяоеио ( ясап1с чогб Маги() ( Рг1еБГгеав г = пп11; спал сл; ггу ( Г = пен Р11езпгеаи("гапбоы.Пап", Р11еМобе.сгеасе)) // Записать английский алфавит в файл. гог(гпг г=с; г < 26; 1ьь) Е.игьсеВупо((Ьусо)('Л'ь1))у // А теперь считать отдельные буквы английского алфавита.