Г. Шилдт - Полный справочник по C++ (1109478), страница 84
Текст из файла (страница 84)
Он определен в классе дев и позволяет хранить максимальныс значения, которые может принимать параметр от(зе!. Тип ввейбхт прелставляст собой перечисление, определенное в классе 1ов. В нем содержатся разновидности поиска, выполняемого функциями вевкп и вев>ср. Часть ». Язык С++ Система ввода-вывода языка Сч+ управляет двумя указателями, связанными с файлами. Первый указатель, определяющий позицию„в которой выполняется чтение файла, называется «урсором чглеяия (йс( рош(ег). Другон указатель, определяющий позицию, в которой выполняется запись в файл, называется «урсором завися (рн! ро)п(ег).
Каждый раз при выполнении ввода и вывода соотвстствуюшнн курсор файла перемешается на одну позицию вперед. Однако функции вее)едО и веекр() позволяют выполнять произвольные перемещения по файлу. Функция вее)<дО перемешает связанный с ней курсор записи ца о(Ьег символов, отсчитывая от позиции ог(я)л. Позиция оп«чл задается тремя возможными значениями. 1ов:: Ьед Начало файла 1оя:: Ьед Тек)чаев положение воя:: епп Конец файла Функция вее)срО перемещает связанный с ней курсор записи на о2)зег символов, отсчитывая от позиции г)пя()ь Позиция опя(л задается тремя возможными значениями.
указанными выше, Как правило. произвольный доступ при вводе-выводе осуществляется только к файлу, открытому в бинарном режиме. Преобразование символов при считывании текстовых файлов может нарушить правильный порядок следования байтов в файле. Следующая программа демонстрирует работу функции вее)срО. Она позволяет изменять указанный сиьчвол в файле.
В командной строке следует зада~ь имя фаила и позицию изменяемого символа, за которой следует новый символ. Обратите внимание на то, что файл открыт лля операций ввода-вывода. В1пс1ийе <вояетеав> Ввпс1нг)е <Гяехеаг«> Мхпс1ос)е <сясс)11Ь> ив«ад патпеврасе вЖ хпс яавп(1пс ахдс, сЛат "ахдч()) ( 1Г( дс!=Е) ( соне « "Применение: СБроСЕ <имя фана|а> <старья символ> <новый символ>~п"; тегнтп 1; Гас«еаза онс(атдч(1], Гоя::вп ] зов::сне ] тоя::Ьхпаху) 1Г Ооос) ( соне « "Невозможно открыть файл."; хегохп 1; осе.веем(асов(ахдч(2]), воя::Ьед) оие.рис(*атдч(3]); осе.с1овеО; хеенхп О; ) Например, чтобы применить эту программу для замены двеналватого символа буквой Х, следует выполнить такую команлу.
$ с)1апде Севе 12 Е Следующая программа использует Функцию вее)<д(). Она выводит на экран содержимое файла, начиная с позиции, указанной в командной строке. Глава 2). Файловая система Мтпс1ис)е <Ковтхеам> Кхпс1ибе <1вттеалз> $1пс1п<(е <свтп11Ь> пв1пд пааеврасе втс)з ьпт лза1п(1пс атдс, спат *атдч[1) ( спат сп; зй(ахдс(=3) ( соит « "Применение: >НОИ <имя файла> <начальная позиция>1п'з тетюха 1з ) 1хвстеагз 1п(атдч[11, 1овзззп [ 1овззЫпату); з.й()з.п) ( соцс « "Невозможно открыть файл."з техатп 1з ) 1п.веекд(асо1(атдч[21), 1овззЬед); ип11е (1п.дев (сп) ) сопс «сп; тетпхп Оз Ниже показано, как с помощью функций везир() и веекд() переставить в обратном порядке первые лиаз символов в файле. $1пс1пз)е <ьовтхеазь> Зьпс1пде <йвттеае> $1пс1пде <свтН11Ь> ив1пд паееврасе всззз тпт тазп(1пс ахдс, спат *атдч[1) ( 11(ахдс)=3) ( спит « "Применение: Нечетве <имя файла> <пие>1п"з тетптп 1з ) йвсхеалз 1поис(атдч[1], 1овзззп ) зовззопт ) зовззыфззату)з И ((фпопс) ( соис « "Невозможно открыть файл.
1п"з теситп 1з ) 1опд е, 1, зз спат с1, с2з е = асо1(атдч[21)з Кот(1=0, б=ез 1<бз 1++, 3--) ( 1попс.вееКд(з, фовззЬед)з засос.дет(с1)," 1поцс.вееКд(5, 1овз:Ьед); 1поит.дет(с2)з Часть )). Язык С++ тпоис.все)тр(т, ъовт:Ьеп); ъпоис.рис(с2)т ъпоик.вее)тр(З, усат:Ьеп); ъпоик.рик(с1)т ) 1поис.с1ове() тесикп От Определение текущей позиции Текущую позицию курсоров чтения и записи можно определить с помощью функции ее11(т() н ее11р(). Их прототипы имеют следующий вил,. ров суре се11д()т ров суре се11р(); Тип ров куре определен в классс вов и позволяет хранить максимальное значсние, ксто- рос может вернуть функция.
Значения, возврацтасмые функциями ее11р() и ее11я(), можно использовать в качестве аргументов функции вее)кв() и вее)кр() соответственно. 1вктеатз авее)тц(ров Суре )юз); овккеаж авее)тп(ров Суре роз) т Эти функции позволяют сохранить текущее положение файлового курсора, выполнип оп- ределенные файловые операции, а затем восстановить прежнее положение курсора ";4 Статус ввода-вывода Система ввода-вывода языка С++ сохраняет информацию о результате каждбй операции ввода-вывода. Текущее состояние системы ввода-вывода хранится в объекте класса 1овсасе, который является перечислением, определенным в классе ков. Кроме этого, класс Вов содержит следующие члены. Имк Существуют два способа получи~ь информацшо о статусе авода-вывода.
Вопервых, можно вызвать функцию кттвеаеееп Она имеет следующий прототип. й ъовсасе тдвсасе()т Эта функция возвращает текущее состояние флагов ошибок. Как следует из вышесказанного, соли никаких ошибок нс обнаружено, функция кттвеаее() возвращает значение вообЬВс. В противном случае устанавливается флаг ошибки. Применение функции кттвеаее() иллюстрируется слсдуюшсй программой. Мвпс1ис)е <вовстеап> т Евпс1ш)е сбвькеаш> иввпп паткеврасе вест Глава 21. Файловая система 1ов т >ВоооЫС тов:тес(Ьтк тсаттта11ЫС тов::Ьадьтс Набор байтов, описывающих нормальное состояние. 1, если обнаружен конец файла, О в противном случае. 1, если обнаружена (возможно) поправимая ошибка. О а противном случае.
1, если обнаружена непоправимая ошибка, О в противном случае. тома сцесквеасиз(11вгтеаж а1п) апе таза(1пе асяс, снаг *асят() ) ( 11(атдс(=2] ( соие « "Применение: Огвр1ау <нмя файла>1п"; гееитп 1; 11вссеага 1п(агду(1)); 11(!1п) ( соис « "Невозможно открыть файл. 1п"; тееитп 1; ) сваг с; ми11е(1п.пес(с) ) ( 11(1п) соис « с; спесквеаеив(ьп)) ) спесвзеасие(1п); // Проверка заключительного состояния. 1п.с1сяе(); кееитп 0; ) чоЫ снесхзеаеив(11встеат а1п) ( 1ов::1оаеаее 1; 1 = 1п.гг)всасе() 11(1 а 1св::еогЬ1Е) соис « "Обнаружен конец файла1п"; е1ве 11(1 а 1ов::еа11Ь1Е) соне « "Обнаружена поправимая отибка)п"; е1ве 11(Ь Ь 1оа::ЬадЬте) соие « 'Обнаружена непоправимая ошибка)п"; ) Эта программа всегда обнаруживает одну "ошибку".
После завершения цикла мЬ11е последний вызов функции снес)гаеаеиа(), как и ожидалось, обнаруживает конец файла. Эта функция может оказаться полезной в любой программе. Второй способ обнаружения ошибки основан на применении следующих функций. | Ьао1 Ьаб(); Ьсо1 еог()> Ьоо1 еа11(); Ьоо1 дооб(); Функция ьаа() возвращает значение екие, если установлен флаг )жм)Ь1е. Функция еоа() возвращает значение етое, если установлен флаг яа11ь1е. Функция поест() возвращает значение етие, если никаких ошибок не обнаружено. В противном случае функция возвращает значение яа1ве. Флаги, соответстауюшие обнаруженным ошибкам, можно сбросить. Для этого следует вызвать с1еат[), прототип которой имеет следующий вид. Часть 1(.
Язык С++ й чо1п) с1еаг (1оясахе /)ая>=1ая:: аосс)Ыг) Если параметр /)ада является объектом дооаЫс (по умолчанию), все флаги ошибок сбрасываются. В противном случае параметр ()паз следует задать произвольно. М Настройка ввода-вывода в файлы В главе 20 были описаны операторы вставки и извлечения, псрсгружснныс для собственных классов. В этой главе был рассмотрен лишь консольный ввод-вывод. Однако, поскольку все потоки в языке С++ одинаковы, псрегрузку операторов вставки и извлечения можно применять как для консоли, так и для файлов. В качестве примера проанализируем слсдуюшую программу, которая модифицирует электронную телефонную книгу, описанную в главе 20.
Эта программа весьма проста. Она позволяет добавлять имена в список или выводить список имен на экран. Лля ввода и вывода телефонных номеров применяются псрегружснныс функции вставки и извлечения. Вы можете переделать эту про~рамму, дополнив ее возможностями поиска нужного номера или удаления нежелательнгвх ~юмеров. «1пс1цг)е <1ояхгееап> 41пс1цг)е саягтеащ> «1пс1цое <сяггапд> ця1пс пагпеярасе яМ/ с1аяя рцопеЬоох ( спат пале(80]; спат агеасо<)е(4]; снах рхе11к(4]/ спаг пцщ(5)) рцЫ1<: рнопеЬсок() ( )' рпопеЬоо)с(снах *п, снах *а, снах *р, снах *пл) ( яхтсру(паще, и): ягтсру(атеасог)е, а)> ягтсру(рхе11х, р); яхгсру(ццл, пт); ) ат1еп() Фехтер йсретагог« (сятгеащ йяггеащ, рнопеЬоох о); ах1епг) гяхтеащ йоретахох» (1яххеащ йяххеятп, рьопеьоок йо); ); // Выводит на экран имя и номер зеленова.
ояггеал йоретахог« (оясхеащ йягтеюп, рпопеЬоон о) ( яггеащ « о.пале с< яхгеащ « "(" « о.ахея<оп)е « ") яхгеащ « о.ргевбк <с яггеащ « о.пцщ « "1п"/ гегцгп ягтеащ; // Функция должна возвращать ссылку на попок. // Вводит имя и номер телеоона. 1яггеащ йоретахог» (1ягтеал йяггеал, рцспеЬоон йс) ( сося « "Введите имя: яхтеащ » о.паще; Глава 21. файловая система сааб « "Введите код города: яггеввз » о.агеааабез сапе « "Введите префиксз яггеаи » о.ргебфкз самс « Введите номер: ясгеаи » а.ппшз сапе « юхп"з геспгп ясгеаюз ) зпг тафп[) ( рнопеЬоок аз снах с; гяггеат рЬ["риопе", заязззп ! 1ояззоьв ) заяззарр); фг([рЬ) ( сапе « "Невозможна открыть файл с телефонной книгой.Ы"з гегагп 1[ ) гог(;з) ( бо ( сапе « "1.