Г. Шилдт - С#4.0 Полное руководство (1160795), страница 85
Текст из файла (страница 85)
Вместо этого они буферизуются на уровне операционной системы до тех пор, пока не накопится достаточный объем данных, чтобы записать их сразу одним блоком. Благодаря этому повышается эффективность системы. Так, на диске файлы организованы по секторам величиной от 128 байтов и более. Поэтому выводимые данные обычно буферизуются до тех пор, пока не появится возможность записать на диск сразу весь сектор.
Но если данные требуется записать на физическое устройство без предварительного накопления в буфере, то для этой цели можно вызвать метод Р1пя)ь чо1С Г1пвв() При неудачном исходе данной операции генерируется исключение 10Ехсербдоп. Если же поток закрыт, то генерируется исключение 0)с1есспгвровег(Ехсерс1оп. По завершении вывода в файл следует закрыть его с помощью метода С1ове () . Этим гарантируется, что любые выведенные данные, оставшиеся в дисковом буфере, будут записаны на диск. В этом случае отпадает необходимость вызывать метод Р1пяЛ () перед закрытием файла.
Ниже приведен простой пример программы, в котором демонстрируется порядок записи данных в файл. записать данные в файл. пвгпо Яуабеш; ов1пс Яувгеш.10; с1авв Хгьбетог11е ( всас1с чогв ма1п(асг1пч() агча) ( Г11езсгеаш Гоос = пп111 лгу ( // Открыть выходной файл. гоьс = пен р11еяггеаш (Г кевг . вхг", рь1емосе.сгеагехеы) 1 // Записать весь английский алфавит в файл. гог(сваг с = ил г с <= 'г'1 с+ь) гоос/игл севусе ( (бусе) с); ) сассв(токхсерггоп ехс) ( Сопво1е. Хгьгепьпе (уошибка ввода-вывода: 1п" + ехс. Мев васе) 1 ) 11па11у 11(гонг != пп11) Гопг.С1ове 0 г ) В данной программе сначала создается выходной файл под названием севс.
схс с помощью перечисляемого значения р11емобе. СгеабеИеы. Это означает, что файл с таким же именем не должен уже существовать. (В противном случае генерируется исключение 10Ехсерг1оп.) После открытия выходного файла в него записываются 448 Часть (. язык С(т прописные буквы английского алфавита. По завершении данной программы содер- жимое файла севс. Схс оказывается следующим. АВсое гон 1 тк1 миОРОВБт(л/ихтя Использование класса й А1еБсгеазт(для копирования файла Преимущество байтового ввода-вывода средствами класса Г11еБ с геаш заключается, в частности, в том, что его можно применить к файлам практически любого типа, а не только к текстовым файлам. В качестве примера ниже приведена программа, позволяющая копировать файл любого типа, в том числе исполняемый.
Имена исходного и выходного файлов указываются в командной строке. /* Копировать файл. Чтобы воспользоваться этой програмыой, укажите имена исходного и выходного файлов. Например, для копирования файла Г1КБТ.ОАТ в файл БЕСОИО.ОАТ введите в командной строке следующее: СоруР11е РГВЯТ.ВАТ ВЕСаВ.ВАТ */ ов1пд Яувгепн овьпд Яувсеш.10; с1авв СоруГ11е всасьс гога Маги(асг1пд() агдв) ( ьпг 1; Г11езсгеаш Гьп = по11; Г11еЯСгеащ Гоос = по11; 11(агдв.ьепдГЬ != 2) ( Сопво1е.нгьсевьпе("применение: СоруГ11е Откуда Куда" ); гегогп; ггу // Открыть файлы. Гьп = пен Г11езсгеащ(агдв(0), Г11енобе.ореп); Гонг = пен Гг1езггеаш(агдв(1), Г11еМобе.Сгеасе)т Скопировать файл. с)о ( = Ьгп.реасвуге О; ьг (1 ! = — 1) гонг .ХгьгеВуге ((буге) г) т ) ньг'е (1 1= -1); ) сассь(1ОЕхсерсьоп ехс) ( сопво1е .игьгеь1пе (" ошибка ввода-вывода: 1п" ь ехс .мевваде); гьпа11у ( ТГ(Г1п != пи11) Р1п.с1ове()т 11(тонг != по11) Гонг.С1ове()) ) ) ) )вава 14.
Применение средств ввода-вывода 449 Символьный ввод-вывод в файл Несмотря на то что файлы часто обрабатываются побайтово, для этой цели можно воспользоваться также символьными потоками. Преимущество символьных потоков заключается в том, что они оперируют символами непосредственно в уникоде.
Так, если требуется сохранить текст в уникоде, то для этого лучше всего подойдуг именно символьные потоки. В целом, для выполненил операций символьного ввода-вывода в файлы объект класса Г11еБггеагя заключается в оболочку класса Бггеаынеабег или Б ггеаыигдгег. В этих классах выполняется автоматическое преобразование байтового потока в символьный и наоборот.
Не следует, однако, забывать, что на уровне операционной системы файл представляет собой набор байтов. И применение класса Бггеаыееабег или БггеаыХгТгег никак не может этого изменить. Класс Бггеатхгдгег является производным от класса техгхгдгег, а класс Бггеаынеабег — производным от класса техгееабег. Следовательно, в классах Бсгеаыреас(ег и Бсгеаынгьсег доступны методы и свойства, определенные в их базовых классах.
применение идасса в~кеатче ксее Для создания символьного потока вывода достаточно заключить объект класса Бггеаль например Г11еБггеавь в оболочку класса Бггеаииг1гег. В классе Бсгеатиг1Гег определено несколько конструкторов. Ниже приведен едва ли не самый распространенный среди них: Бтгеаямггвег (Б Ггеам поток) где поток обозначает имя открытого потока.
Этот конструктор генерирует исключение Агг(пыепгехсергтоп, если поток не открыт для вывода, а также исключение Агоптепгхп11ехсерг1оп, если поток оказывается пустым. После создания объекта класс Бсгеатигтсег выполняет автоматическое преобразование символов в байты. Ниже приведен простой пример сервиаюй программы ввода с клавиатуры и вывода на диск набранных текстовых строк, сохраняемых в файле гезг . гхг.
Набираемый тест вводится до тех пор, пока в нем не встретится строка "стоп". Для символьного вывода в файл в этой программе используется объект класса Е11еБГгеаы, заключенный в оболочку класса Бггеаыигдсег. Простая сервисная программа ввода с клавиатуры и вывода на диск, // Лемонстрирукмая ПРименение класса Бсгеаиигтсег. па1пс Буясекя пятно Буялеи.10; с1аяя Ксоо ( яяасьс яоьс Наьп() ( злгьпЧ ясг; Г11езтгеаы Гочс; Открыть сначала поток Файлового ввода-вывода.
ггу ( Гонт = пен Г11езсгеам("Геяс.лхс", Г11еиос(е.огеаяе) ) 450 Часть (. Язык С() сатсь(1ОЕхсертьоп ехс) ( сопяо1е.хгьгеьтпе("Ошибка открытия файла:~п" + ехс.меяяаче) теспгп ," // Заключить поток файлового ввода-вывода в оболочку класса Ятгеашнт1гет. Бтгеашнт1тег тятт опт = пен Ятгеашнттсег(тост)1 ггу ( Сопяо1е.ХгьтеЬтпе("Введите текст, а по окончании — 'стоп'."); бо ( Сспяо1е.нг1те(": "); ясг = Сопяо1е.реаос1пе() ( 11(ягт != стоп ) ( ягт = ягг + "1г1п") О добавить новую строку тятг опт .Хгтте (ятг) 1 ) ) нн11е (ятг != 'стоп"); ) сагсн (1ОЕхсергьоп ехс) ( сопяо1е.хт1геь1пе("Ошибка вводя-выводаг кп" + ехс.незвале) ) 11па11у ( Еятг опт.С1ояе(); ) В некоторых случаях файл удобнее открывать средствами самого класса Бьгеашхггьег.
Для этого служит один из следующих конс(рукторов: Ягтеашхт1гет[ягг1пп путь) ЯтгеатИттбет(ятттпч путь, Ьоо1 аррепЩ где путь — это имя открываемого файла, включая полный путь к нему. Если во второй форме этого конструктора значение параметра аррепс( равно сгпе, то выводимые данные присоединяютсв в конец существующего файла. В противном случае эти данные перезаписывают содержимое указанного файла.
Но независимо от формы конструктора файл создается, если он не существует. При появлении ошибок ввода- вывода в обоих случаях генерируется исключение 1ОЕхсерсфоп. Кроме тото, могут быть сгенерированы и другие исключения. Ниже приведен вариант представленной ранее сервисной программы ввода с клавиатуры и вывода на диск, измененный таким образом, чтобы открывать выходной файл средствами самого класса Бсгеашиг1сег. // Открыть файл средствами класса ЯттеаюИтьгет. ия1пс Яуятеш) пя1пч Буятеш.
10; с1аяя КсоР ( ятатгс чо1б Мата() ( ятг1по ясг1 Ятгеашигьтег тятг опт = пп11; сгу ( // Открыть файл, заключенный в оболочку класса Яттеашнгттег. Глава 14. Применение средств ввода-вывода 451 гясг опс = пен Ясгеашигусег("Геяс.схс")) Сопяо1е.нгусеьупе("Введите текат, в по окончании — 'стоп'.") г)п ( -Сопяо1е.Иг1се(": "); ясг = Сопяо1е.невов1пе(): 11(ясг != "стоп") ( ягг = ягг + "1г1п") // добавить новУю строку Гясг оис.исусе(ясг); ) ни11е(вгг != "стоп"); ) свгсП(1ОЕхсерсьоп ехс) ( Сопяо1е.иг1геюпе("Ошибка ввода-вывода:1п" + ехс.Меяяаде) ) Ггпя11у ( 11(тясг опс != пп11) Гясг огГ.С1ояе(); ) Применение кдасса Бсееашйеайее Для создания символьного потока ввода достаточно заключить байтовый поток в оболочку класса Я с геашнеаг)ег. В классе Я сгеашнеаг)ею определено несколько конструкторов. Ниже приведен наиболее часто используемый конструктор: Яггеашнеабег(зггевш поток) где поток обозначает имя открытого потока. Этот конструктор генерирует исключение Агопшепсни11ехсерс1оп, если поток оказывается пустым, а также исключение АгсишепСЕхсерг1оп, если поток не открыт для ввода.
После своего создания объект класса Яггеашреабег выполняет автоматическое преобразование байтов в символы. По завершении ввода из потока типа Ясгеашнеас)ег его нужно закрыть. При этом закрывается и базовый поток. В приведенном ниже примере создается простая сервисная программа ввода с диска и вывода на экран содержимого текстового файла Се я С . Схг. Она служит дополнением к представленной ранее сервисной программе ввода с клавиатуры и вывода на диск.