Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 84
Текст из файла (страница 84)
Применение класса Я~хеал%кхСек Для создания символьного потока вывода достаточно заключить объект класса Ясгеав, например р11езсгеав, в оболочку класса ЯсгеавИг1сег. В классе Ясгеавиггсег определено несколько конструкторов. Ниже приведем едва ли ие самый распространенный среди иих. Яггеавыгггег (Яггеав поток) 434 часть(, язык с» где поток обозначает'имя открытого потока.
Этот конструктор генерирует исключение Агдпщептнхсерб1оп, если поток не открыт для вывода, а также исключение йтдпшепснп11ехсерс1оп, если поток оказывается пустым. После создания объект класса Ясгеашхгасег выполняет автоматическое преобразование символов в байты. Ниже приведен простой пример сервисной программы ввода с клавиатуры и вывода на диск набранных текстовых строк, сохраняемых в файле сеяс.
схс. Набираемый тест вводится до тех пор, пока в нем не встретится строка "стоп". Для символьного вывода в файл в этой программе используется объект класса е11еястеащ, заключенный в оболочку класса ЯтгеашИтабет. // Простая сервисная программа ввода с клавиатуры // и вывода на диск, демонстрирующая применение // класса Яягеашиг1пег. пяапя Яуятеют пяапд Яуятеш.101 с1аяя ксоп ( ясас1с чо1т) маап() ( яягапс яягт У11езхгеаш тост) сгу ( тост = пен Г11еЯСгеаш("Сеяя.тхя", Е11еиот(е.сгеапе)) ) сапой(1ОЕхсероаоп ехс) ( Сопяо1е.Игаьеъъпе("Не удается открыть файл")т Сопяо1е.игаяеъупе(ехс.меяяаде)т гесогп т ЯпгеашИгатег тапг опб = пеи Япгеашигттег(тост)т Сопяо1е.нгасеьапе("Введите текст, а по окончании — 'стоп'."); Со ( сопяо1е.хг1се(": ")т яог = Сопяо1е.аеабнъпе()т 11(яяг != "стоп") ( ясг = ясг ь "1г1п"т // добавить символ новой строки сгу ( тятя опя.иг1ье(яяг)) ) саясн(1ОЕхсеряаоп ехс) ( Сопяо1е.нг1теьапе("Ошибка записи в файл")," Сопяо1е.иг1СеЬгпе(ехс.Меяяаяе)) Ьгеахт ) ) нь11е(япг )= "стоп"); тясг опт.с1ояе() т Глава !4.
Применение средств ввода-вывода 435 В некоторых случаях файл удобнее открывать средствами самого класса Я г геашиг1се г. Для этого служит один из следующих конструкторов: Яггевшигггег(вгг1пд имя файла) Ясгевшиггсег(всггпд имя файле, Ьоо1 вррепс(71ад) где имя файла — это имя открываемого файла, включая полный путь к нему Если во второй форме этого конструктора значение аррепг(Е1ад равно Ьгпе, то выводимые даииые присоединяются в конце существующего файла. В противном случае эти данные перезаписывают содержимое указаииого файла. Но независимо от формы конструктора файл создается, если ои ие существует.
При появлении ошибок ввода-вывода в обоих случаях генерируется исключение 1Оехсерг1оп. кроме того, могут быть сгеиерироваиы и другие исключения. Ниже приведен вариант представленной ранее сервисной программы ввода с клавиатуры и вывода иа диск, переделанный таким образом, чтобы открывать выходной файл средствами самого класса Яггеашиг1гег.
// Открыть файл средствами класса Ясгевшиггсег. пв1пд Яувсешт ив1пд Яувсеш.10т с1вяв Ксоп ( всвсгс чо16 Мвгп() ( всг1пд всг; 5сгевшиггтег Гясг онст ггу ( Гвсг оис = пен 5сгевшИг1Гег("Гевс.схс")и ) салоп(1ОБхсерс1оп ехс) ( Сопво1е.иг1се11пе("Не удается открыть файл"); Сопво1е.иг1ге11пе(ехс.иевваде)т гегнгп; ) Сопво1е.Иг1севгпе("Введите текст, в по окончании — 'стоп'."); бо ( Сопяо1е.Иг1се(": "): всг = Сопво1е . РевбЬ1пе () ) 11 (вгг != "стоп ) ( вгг = вгг + "1г1п"и // добавить символ новой строки ггу ( Гвсг опс.иггге(вгг)т ) свссп(1ОЕхсерс1оп ехс) ( Сопяо1е.ИггсеЬгпе("Ошибка записи в файл")и Сопво1е.иг1се11пе(ехс.меяввде)т Ьгеваы ) ) ) ни11е(ясг )= "стоп"); 436 часть ), язык Са гатт оиС.С1ояе() ) ) Применение класса Я~хеал)аеайек Для создания символьного потока ввода достаточно заключить байтовый поток в оболочку класса Яттеашиеас)ег. В классе БСтеашиеас)ег определено несколько конструкторов.
Ниже приведен наиболее часто употребляемый конструктор. Бтгеяшаеак)ег (Ясгеаш поток) где поток обозначает имя 'открытого потока. Этот конструктор генерирует исключение Агдишептни11Ехсер11оп, если поток оказывается пустым, а также исключение лгдишепсехсерт1оп, если поток не открыт для ввода. После создания объект класса Ясгеашиеаг)ет выполняет автоматическое преобразование байтов в символы. В приведенном ниже примере создается простая сервисная программа ввода с диска и вывода на экран содержимого текстового файла Сеет.
ахи. Она служит дополнением к представленной ранее сервисной программе ввода с клавиатуры и вывода на диск. // Простая сервисная программа ввода с диска и вывода // на экран, демонстрирующая применение // класса Ястеашаеак)ет. ияьпд 5уясеш; паапа Яуятеш.10к с1аяя Птоз ( ясатьс чогн Маго() ( Е11е5тгеаш гьп; ясг1по як гту ( Ггп пен Г11езтгеяш("Сеяг.схс", Г11емобе.преп); ) сатин(1ОЕхсерс1оп ехс) ( Сопяо1е.нт1теььпе("Ошибка открытия файла"); Сопяо1е.нтгсеньпе(ехс.Меяяяое)к гесигп; ) Ятгеашаеабег гятт тп = пен Ятгеашкеак(ег(11п)к ггу ( нв11е((я = гатт 1п.неак)11пе()) != пи11) ( Сопяо1е. Игьсе11пе (я); ) ) пасс)з(1ОЕхсерт1оп ехс) ( Сопяо1е.Итасенвпе("Ошибка чтения нэ файла"); Сопяо1е.нгьтеъьпе(ехс.иеяяаое)к ) Гяст ап.С1ояе() ) ) ) Глава !4.
Применение средств ввода-вывода 437 Обратите внимание на то, как в этой программе определяется конец файла. Когда метод кеас(Ыпе () возвращает пустую ссылку, это означает, что достигнут конец файла. Такой способ вполне работоспособен, но в классе есгеаивеас)ег предоставляется еще одно средство для обнаружения конца потока — Епс(ос Эггеаяг Это доступное для чтения свойство имеет логическое значение сгпе, когда достигается конец потока, в противном случае — логическое значение Га1яе. Следовательно, свойство епс(01зггеат можно использовать для отслеживания конца файла. В качестве примера ниже представлен другой способ организации цикла ып11е для чтения из файла. нп11е(!Гягг 1п.кпс(ОГэггеап) ( я = Гягг 1п.кеес(Ь1пе (); Сопяо1е.ыгаге11пе(я); ) В данном случае код немного упрощается благодаря свойству епс(Огэсгеам, хотя общий порядок выполнения операции ввода из файла не меняется.
Иногда такое применение свойства Епс(ОГЯСгеам позволяет несколько упростить сложную ситуацию, внося ясность и улучшая структуру кода. Иногда файл проще открыть, используя непосредственно класс зс геапееас(е г, аналогично классу Есгеавнгагег.
Для этой цели служит следующий конструктор: зггеятпеэоег(вагапа имя файла) где имя файла — это имя открываемого файла, включая полный путь к нему. Указываемый файл должен существовать. В противном случае генерируется исключение е11еносеоппс(ехсерг1оп. Если имя файла оказывается пустым, то генерируется исключение дгдовепснп11Ехсерс1оп. А если имя файла содержит пустую строку, то генерируется исключение дгдпмепСЕхсерг1оп. Кроме того, могут быть сгенерированы исключения 1ОЕхсергаоп и Оагесгогуног коппс(кхсергаоп. Переадресация стандартных потоков Как упоминалось ранее, стандартные потоки, например сопяо1е.
1п, могут быть переадресованы. И чаше всего они переадресовываются в файл. Когда стандартный поток переадресовывается, то вводимые или выводимые данные направляются в новый поток в обход устройств, используемых по умолчанию. Благодаря переадресации стандартных потоков в программе может быть организован ввод команд из дискового файла, создание файлов журнала регистрации и даже чтение входных данных из сетевого соединения.
Переадресация стандартных потоков достигается двумя способами. Прежде всего, это делается при выполнении программы из командной строки с помощью операторов < и >, переадресовывающих потоки Сопя о1е. 1п и С оп яо1е. Опг соответственно. Допустим, что имеется следующая программа: ия1по Яуясеап с1аяя теяг ( ясасас тога Ма1п() ( Сопяо1е.игасеаапе("Это тест.")в ) ) 438 Часть (. йзык СЗ Если выполнить зту программу из командной строки Таей > 1од то символьная строка "Это тест.
" будет выведена в файл 1оо. Однако для переадресации ввода указываемый источник входных данных должен удовлетворять требованиям программы, иначе она "зависнет". Операторы < и >, выполняющие переадресацию из командной строки, не являются составной частью С(), а предоставляются операционной системой. Поэтому если в рабочей среде поддерживается переадресация ввода-вывода, как, например, в %(пт(оьчя, то стандартные потоки ввода и вывода можно переадресовать, не внося никаких изменений в программу. Тем не менее существует другой способ, позволяющий осуществлять переадресацию стандартных потоков под управлением самой программы.
Для этого служат приведенные ниже методы Бес1п (), БеСОцс () и Беснггог (), являющиеся членами класса Сопяо1е. згагтс чотп Бег1п(техтаеабег ввод) зсастс чо1б БеГОцс(техсигтсег вывод) зсастс чоаб Бесхггог(техснг1сег вывод) Таким образом, для переадресации ввода вызывается метод Яег1п () с указанием требуемого потока. С этой целью может быть использован любой поток ввода, при условии, что он является производным от класса техбнеас(ег.
А для переадресации вывода вызывается метод Яесоцс О с указанием требуемого потока вывода, который должен быть также производным от класса техснеас)ег. Так, для переадресации вывода в файл достаточно указать объект класса 511еЯггеаш, заключенный в оболочку класса Бсгеашнг1сег. Соответствующий пример программы приведен ниже. // Переадресовать поток Сопзо1е.оцс. цз1пд Бузсеш) цзтпд Буясеш.1от с1аяя Кебтгесс ( ягаг1с чоки матп() ( Бсгеашыгтсег 1оч оцст ггу ( 1од оцс = пен Бсгеашиг1сег("1о0111е.схс"); ) сассп(1ОЕхсерс1оп ехс) ( Сопяо1е Нгкгеькпе("ошибка открытия файла журнала регистрации" ) сопзо1е.игагеетпе(ехс.меззаде); гегцгп) ) // Переадресовать стандартный вывод в // файл 1о0111е.схг. Сопяо1е.зегоцс(1од оцс)т сгу ( Сопзо1е.иг1сеьтпе("Это начало файла журнала регистрации."); Гог(1пс 1=от 1<10; 1+ь) Сопзо1е.иг1геъ1пе(1)т Глава (4.
Применение средств ввода.вывода 439 Сопво1е.нг1сеъ1пв("Это конец файла журнала регистрации.")т ) свесь(10вхсерг1оп ехс) ( Сопво1е.нг1геъ1пе("Ошибка записи в файл журнала регистрации") Сопво1е.игасеьъпе(ехс.иевзаое); 1оо оцГ.С1озе(); ) При выполнении этой программы на экран ничего не выводится, но файл 1бдт11е. схс будет содержать следующее: Это начало файла журнала регистрации. о 1 2 3 5 б 7 8 а Это конец файла журнала регистрации. Попробуйте сами поупражняться в переадресации других встроенных потоков. Чтение и запись двоичных данных В приведенных ранее примерах демонстрировались возможности чтения и записи байтов или символов. Но ведь имеется также возможность (и ею пользуются часто) читать и записывать другие типы данных. Например, можно создать файл, содержащий данные типа 1пг, с(Оные или зпогс.