Г. Шилдт - С#4.0 Полное руководство (1160795), страница 88
Текст из файла (страница 88)
Е.зееь(0, Яееиог101п.ве01п)у // найти первый байт сп = (сваг) Г.реабВусе()) Сопяо1е.иггпе11пе("Первая буква: " + сь); г.зееь(1, Яееьог1о1п.Ведьп); // найти второй байт сь = (сваг) г.кеадвусе(); Сопяо1е.иг1те11пе("Вторая буква: " + сп); Е.зееь(0, Яееьог101п.вечгп); // найти пятый байт сп = (сьаг) г.йеас)Бусе(); Сопяо1е.иггте11пе (" Пятая буква: " + сп) ) Сопяо1е.иг1пе11пе(); // й теперь прочитать буквы английского алфавита через одну.
сопяо1е .хгьпеььпе (" Буквы алфавита через одну: ") ) гогрьпс г=с; 1 < 26; 1 += 2) ( г.зееь(1, Яееьог101п.ведгп)у // найти 1-й символ сь = (спас) г.йеаовуте(); Сопяо1е.иг1пе(сп + " ")) ) ) сапов(10кхсерс1оп ехс) ( сопяо1е.хгзгеььпе("оыибка ввода-вывода1п" + ехс.меяяаде)) ) 61па11у ( 16(г )= пп11) 1.01ояе(); ) Сопяо1е.иг1пе11пе(); ) При выполнении этой программы получается следующий результат. Глава 14. Применение средств ввода-вывода 463 Первая буква: А Вторая буква: В Пятая буква: Е Буквы алфавита. через одну: А с е 6 1 к м о 0 я и х т Несмотря на то что метод Бее)г () имеет немало преимуществ при использовании с файлами, существует и другой способ установки текущего положения в файле с помощью свойства Роз1?1оп. Как следует из табл. 14.2, свойство Ровд?доп доступно как для чтения, так и для записи. Поэтому с его помощью можно получить или же установить текущее положение в файле. В качестве примера ниже приведен фрагмент кода из предыдущей программы записи и чтения из файла с произвольным доступом галс)ов.
с(а?, измененный с целью продемонстрировать применение свойства РОЯ1?1оп. сопяо1е.х?1?еььпе("Буквы алфавита через одну: ")г го?(?п? 1=01 1 < 26; ь += 2) ( Г.роя??гоп = 11 /! найти ?-й символ посредством свойства Роя??1оп сЬ = (ода?) г.ятагану?е () г Соп*о1е.и?ь?е(сЬ + " ")г Применение класса М(мпохув~геаа Иногда оказывается полезно читать вводимые данные из массива или записывать выводимые данные в массив, а не вводить их непосредственно из устройства или выводить прямо на него. Для этой цели служит класс МевогуБС?еав. Он представляет собой реализацию класса Б?геав, в которой массив байтов используется для ввода и вывода. В классе МевогуБ?геав определено несколько конструкторов.
Ниже представлен один из них: Мево?уз??еав(Ьу?е[ ] Ьи?Еег) где ЬиГГег обозначает массив байтов, используемый в качестве источника или адресата в запросах ввода-вывода. Используя этот конструктор, следует иметь в виду, что массив Ьиггег должен быть достаточно большим для хранения направляемых в него данных. В качестве примера ниже приведена программа, демонстрирующая применение класса Мево гуБ? геав в операциях ввода-вывода.
Продемонстрировать применение класса Мено?уз??еав. пя1по Яуя?епч пя?по Яуя?ев. 10; с1аяя МевЯ??пево ( я?а?1с чо1С Маял() ( Ьу?е(] я?о?аЧе = лен Ьу?е[255]; Создать яапоминаювий поток. Мево?уЯ??еав вевя??в = пеи Мево?уз??еав(я?о?аде) Заключить объект везя??в в оболочки классов 464 Часть!. Язык С() // чтения и записи данных в потоки. Яггеавыгггег вепигг = пен ЯггеавХгзгег(апевягпп); Яггеаввеабег зевса)г лен Яггеаввеабег(вевялгв); Сгу ( Записать данные в память, используя объект вевнСг. ьог(1пС а=О; 1 < 10) 1++) вевнсг.иг1сеь1пе("Ьусе [" + 1 + "]: " + г)а // Поставить в конце точку. вевнгг.иг1Се01пе("."): вепигг.р1цял()а Сопяо1е.нгггекьпе("Чтение прямо из массива ягогаде: Отобразить содержимое массива яоогаЧе непосредственно. белеясь(сьаг сЬ ьп ясогаЧе) ( 1б (сЬ == '.') Ьгеаьи Сопяо1е.игтге(сл)п ) Сопяо1е.игтге11пе("1пчтение из потока с помощью объекта вевгог: Читать из объекта вевяггв средствами ввода данных из потока.
вевясгв.яеех(0, яее)аог191п.вечтп)) // установить указатель файла // в исходное положение яог1пЧ вбг = вевгбг.кеас11пе()~ нк11е(ягг )= по11) ( ясг = зевса(г.кеаоьтпе()а 11(яСг[0] == '.') Ьгеаса Сопяо1е.нгьоесапе(ягг); ) сагсЬ(108хсергзоп ехс) ( Сопяо1е.Иггсеьфпе("Ошибка ввода-вывода1п" + ехс.неяяаЧе); Гупа11у ( // Освободить ресурсы считывающего и записывающего потоков.
вевнсг.С1ояе()1 вевгсг. С1ояе () а Вот к какому результату приводит выполнение втой программы. Чтение прямо из массива ягогасе: Ьусе [0]: 0 Ьусе [1): 1 Ьуяе [2]: 2 Ьуге [З]а З Ьуое [я]а я Ьусе [5]: 5 Ъуге [б]а б ЬуСе [7]а 7 Ьусе [8]: 8 Ьуяе [9) а 9 Глава 14. Применение средств ввода-вывода 466 потока с псмсшью объекта шештбт: 1 2 3 5 б 7 8 9 Чтение из ЬуСе (1]: Ьусе (2]: Ьусе (3]: Ьусе (4]: Ьуге (5]: Ьуге (б]: Ьуее (7): Ьусе (8]: Ьуте (9]: Применение классов Я~г~пдд4еас1ег и ВШпдИгНег Для выполнения операций ввода-вывода с запоминанием в некоторых приложениях в качестве базовой памяти иногда лучше использовать массив типа з ссгпо, чем массив типа Ьуге. Именно для таких случаев и предусмотрены классы БС тыл ЧНеа с)е г и Бтг1пЧИг1Сег.
В частности, класс БСг1пчпеас)ег наследует от класса текгйеаг]ег, а класс Бсг1поиг1сег — от класса техсиг1сег. Следовательно, они представляют собой потоки, имеющие доступ к методам, определенным в этих двух базовых классах, что позволяет, например, вызывать метод Неас(Ь1пе () для объекта класса Бсг1пчнеас)ег, а метод игтсеьдпе () — для объекта класса Бсг1поиг1сег. Ниже приведен конструктор класса Бгг1попеабег: БСгьпчаеас(ег(еттьпч Ю где з обозначает символьную строку, из которой производится чтение. В классе Бггспонг1Сег определено несколько конструкторов.
Ниже представлен один из наиболее часто используемых. Бтт1пчнт1Сет() В этой программе сначала создается массив байтов, называемый всогаое. Затем этот массив используется в качестве основной памяти для объекта шешесгш класса Нешогуэтгеаш. Из объекта шешеггт, в свою очередь, создаются объекты шешгс)г класса Бсгеашкеас)ег и шешнсг класса Бсгеашнг1сег. С помощью объекта шешнсг выводимые данные записываются в запоминающий поток.
Обратите внимание на то, что после записи выводимых данных лля объекта пешнст вызывается метод 51пеь () . Это необходимо для того, чтобы содержимое буфера этого объекта записывалось непосредственно в базовый массив. Далее содержимое базового массива байтов отображается вручную в цикле тогеасЬ. После этого указатель файла устанавливается с помощью метода Бее)с () в начало запоминающего потока, из которого затем вводятся данные с помощью объекта потока тешгбг. Запоминающие потоки очень полезны для программирования.
С их помощью можно, например, организовать сложный вывод с предварительным накоплением данных в массиве до тех пор, пока они не понадобятся. Этот прием особенно полезен для программирования в такой среде с графическим пользовательским интерфейсом, как Х!пг]оъув. Кроме того, стандартный поток может быть переадресован из массива. Это может пригодиться, например, для подачи тестовой информации в программу. 466 Часть (. Язык С() // // Продемонстрировать применение классов Бтгьпчаеабег и Ятгьпчнгттег.
пятпэ Буятеьч ия1пд Яуятеш.10; с1аяя Бтгкбгктгоешо ( ятатзс чогб Матп() ( Бтг1пЗИгттег ятгитг = пп11; Яггтп9реабег яттгбт = пп111 тгу ( // Создать объект класса Бтг1пчнг1тег. яггигг = пеи Бггзпциг1тег(); // Вывести данные в записывающий поток типа Ятгьпднтттег. Еог(гпт 1=01 1 < 10; 1++) ятгитг.нгзтеьтпе("Значение т равно: " + 1); // Создать объект класса Ятгьпчаеабег. ятггбг = пеи Бтг1пцкеабег(ятгитг.тоятг1п9()) // Ь теперь ввести данные из считывающего потока типа Бтгьпдаеабег. ятг1пд ятг = ятггбг.кеаЖЕпе()Г ик11е(ятг )= пп11) ( ятг = ятггдг.кеаг)ЬЕпе(); Сопяо1е.нгттеЬЕпе(ятг); ) ) сатсь(1ОБхсерт1оп ехс) ( Сопяо1е.нг1теь1пе("Ошибка ввода-вывода1п" + ехс.Меняле)7 ) Егпа11у ( // Освободить ресурсы считывающего и записывающего потоков.
1Е (ятггбг )= пи11) ятггбг.С1ояе () ) тЕ (ятг«тг )= пп11) ятгитг.С1ояе (] ) ) ) ) Вот к каком результату приводит выполнение этого кода. т равно: 1 равно: 2 1 равно: 3 т равно: 4 т равно: 5 равно: б т равно: 7 равно: 8 равно: 9 Значение Значение Значение Значение Значение Значение Значение Значение Значение Этот конструктор создает записывающий поток, который помещает выводимые данные в строку. Длл получения содержимого этой строки достаточно вызвать метод ТОБСг1пп () . Ниже приведен пример, демонстрирующий применение классов Бгг1понеас)ег и Бсг1пдиг1гег. Глава 14. Применение средств ввода-вывода 467 В данном примере сначала создается объект я сгисг класса Бсгйпдигъсег, В КОТО- рый выводятся данные с помощью метода Нг1се Г 1пе ( ) .
Затем создается объект класса Б Гг1пднеас)е г с использованием символьной строки, содержащейся в объекте я С гнгг. Эта строка получается в результате вызова метода ТоБГгьпд() для объекта яггигг. И наконец, содержимое данной строки считывается с помощью метода неас(Ь1пе () . Класс й.1е В среде . НЕТ Ргатетцог)г определен класс Е11е, который может оказаться полезным для работы с файлами, поскольку он содержит несколько статических методов, выполняющих типичные операции над файлами. В частности, в классе Е11е имеются методы для копирования и перемещения, шифрования и расшифровывания, удаления файлов, а также для получения и задания информации о файлах, включая сведения об их существовании, времени создания, последнего доступа и различные атрибуты файлов (только для чтения, скрытых и пр.).