Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 44
Текст из файла (страница 44)
9.5. Произвольный доступ В системе ввода/вывода С++ произвольный доступ (галеот ассеи) реализуется с помощью функций вее)гф) и вее3ц)О, являющихся соответственно потоковыми функциями ввода и вывода. Здесь показаны их основные формы: ~высеем швее)сд(оН еуре смещение, вееМ~х аааанве) ов1ееащ йвееЫр(оКЮ Еуре смещение, вее)сЖг ведение) Здесь ой (уре -- это целый тип данных, определенный в классе Йв и со- вместимый с максимальным правильным значением, которое способен хра- нить параметр смещение. Тип вееИ!г — это перечисление, определенное в классе 1оз и содержащее следующие значения: Значение Смысл 1ов:: Ьед 1ов::сцг Поиск с начала файла Поиск от текущей позиции в файле Поиск с конца файла 1ов::ела Как правило, файлы, доступные для функций веейц() и вее1р(), должны открываться в режиме операций для двоичных файлов. Таким образом предотвращается возможное неожиданное преобразование символов внутри файла.
Определить текущую позицию каждого из двух указателей можно с помо- щью функций: Система ввода/вывода С++ управляет двумя указателями, связанными с файлом. Первый — это указатель считывания (яегротгег), который задает следующее место в файле„откуда будет вводиться информация. Второй— это указатель записи (риГро(пгег), который задает следующее место в файле, куда будет выводиться информация. При каждом вводе или выводе соответствующий указатель последовательно продвигается дальше.
Однако с помощью функций веем() и вее((рО возможен непоследовательный доступ к файлу. Функция вее)сйО устанавливает указатель считывания соответствующего файла в позицию, отстоящую на величину смещение от заданного места задание. Функция вее)гр() устанавливает указатель записи соответствующего файла в позицию, отстоящую на величину смещение от заданного места задание. Глава 9.
Дополнительные вазмохгнасги ввода/вывода в С++ 293 ров Туре Те11о(); ров Туре Те11рП Г Здесь РОЯ ()гре — это целый тип данных, определенный в классе ]ов и спо- собный хранить наибольшее возможное значение указателя. Для перемещения файловых указателей считывания и записи на позицию, заданную возврагцаемыми значениями функций 1Е]]фО и 1ейрО, используются перегруженные версии функций >ее](~() и веЖр(). Прототипы этих функций представлены ниже: ь'.вТкеат йвее)щ(ров Туре позиция) овТпеаай1вее)<р(ровТуре позиция> ',Примеры ], В следующей программе показана работа функции вее]тра. Она позволяет заменить в файле заданный символ.
Укажите в командной строке имя файла, затем номер байта в файле, который вы хотите изменить, и, наконец, новый символ для замены. Обратите внимание: файл открывается для операций чтения и записи. (]1пс1пс)е <1ояттеалг> ()1пс1псе <тягпеалг> ()1пс1пае <сябг)11Ь> пя1пд паглгырасе ягс(Г 1пг з~ауп(1пт атас, спал "'агу-"(]) Ы(аг()с! =4) ( сопв « "Замена: <файл> <байт> <символ>1о"; гегпгп 1; йястеага оцт(агдч11], зоя:."1п ) 1оя::опв ) 1оя::Ьупагу)г 1~(!оиг) ( сопб « "Оайп открыть невоэмоино1п"; геспгп 1; оиТ.веем(ассу(атцц(2]), 1оя::Ьед)г опТ.рпе(*атд~г(31); оцг, с1ояе(); гегигп Ог Самоучитель С++ 1, В следуюшей программе функция зее)гяО используется для теля считывания в заданную позицию внутри файла и для мого файла, начиная с этой позиции.
Имя файла и считывания задаются в командной строке. установки указа- вывода содержи- позиция начала О Демонстрация работы Функции яеекд() ()1пс1пс(е <1озлтеатз> ()ьпс1сс(е <ззезеат> ()1пс1ис(е <ся'ьс(11Ь> пя)пс панеярасе зМт Фпь та'и (1пс агдс, спаг *акдч !) ) ( сваг сп; ьт(ахдс!=3) ( собак « "поиск: <Файл> <позиция>~п"р теспзп 1; 1~зекеап 1п(еевич(1), воз::1п т тоз:: Ььпату); 1т(!1п) ( сопл « 'оайл открыть незозмозно~п"т пеьпгп 1; ап.зее)о2(асоь(агд~т(21), 1оз::Ьед)) х)п1е ()1п.еой О ) ( 1п. цес (сп); соиь «сп; 1п.с1озе(); тесптп 0; 1. Напишите программу для вывода на экран содержимого текстового файла в обратном порядке. (Подсказказ Обдумайте задание перед началом программирования. Решение проще, чем может показаться на первый взгляд.) 2.
Напишите программу, которая попарно меняет местами символы в текстовом файле. Например, если в файле содержится "1234", то после выполнения программы там должно содержаться "2143". (Для простоты считайте, что в файле содержится четное число символов.) Глава 9. Дополнительные возможности ввода/вывода в С++ 9.6. Контроль состояния ввода/вывода В системе ввода/вывода С++ поддерживается информация о состоянии после каждой операции ввода/вывода. Текушее состояние потока ввода/вывода, которое хранится в объекте типа !ов1а1е, является перечислением, определенным в классе 1ов и содержащим следующие члены: Название Значение Ошибок нет оообЬ~1 ео1Ь!1 Достигнут конец файла Имеет место нефатальная ошибка 1а!ЬЬ Имеет место фатальная ошибка ЬабЬЬ В устаревших компиляторах флаги состояния ввода/вывода хранятся как целые, а не как объекты типа !ов1а1е. Имеются два способа получения информации о состоянии ввода/вывода.
Во-первых, можно вызвать функцию гдв1а1еО, являющуюся членом класса !ов. Прототип этой функции: ~овесе хсЬвкаке0; Функция возвращает текущее состояние флагов ошибки. Как вы, вероятно, догадываетесь„глядя на приведенный выше список флагов, функция п)в1а1е() возвращает флаг аоойЫ1 при отсутствии какой бы то ни было ошибки. В противном случае она возвращает флаг ошибки. Другим способом определения того, имела ли место ошибка, является использование одной или нескольких следующих функций — членов класса !ов: Ьоот.
ЬакГ ( ); ЬОО1 еой () гроот к'вЗ.Х ( ); Ьоо1 доо40 ' Функция ее!О уже обсуждалась. Функция ЬадО возвращает истину, если установлен флаг ЬадЬ!1. Функция !а!!О возвращает истину, если установлен флаг !а!!Ы1. Функция аоод возврашает истину при отсутствии ошибок. В противном случае функции возвращают ложь. После появления ошибки может возникнуть необходимость сбросить это состояние перед тем, как продолжить выполнение программы.
Для этого используется функция с!еаг(), являющаяся членом класса !ов. Ниже приведен прототип этой функции: тога сЗ.евк(ковкаЬа фляга = з.ов::доос3ЬхЕ); Самоучитель С++ Если параметр (((штги равен цоодЫ1 (значение по умолчанию), то сбрасываются флаги всех ошибок. В противном случае переменной 4лаги присваиваются значения тех флагов, которые вы хотите сбросить. '.".Прй меры:-'.) 1.
В следующей программе иллюстрируется выполнение функции г(Ыа1еО. Программа выводит на экран содержимое текстового файла. При наличии ошибки функция сообщает об этом с помощью функции сйесМта1взо. ()тпс1пбе <1озТгеап~> ()1пс1и<(е <1зггеат> из1пд патпезрасс згпт чоЫ спескзтаепз(1бзтгеап а1п); 1пт паап(1пг атас, спаг *агут(]) гй(агдс!=2) сопг « гзодершимое: <имя файла>хп"; гесигп 1; ьбзггеаш п(агсч[1)) 1Е (! 1п) т( сопг « "Файл открыть невозможнохп"; гегпгп 1; сваг. с; иЫ.1е(1п,Чей(с)) сонг « с; сЬескзгагпз(1п); ) спескзсасыз (1п); уу контроль финального состояния 1п.с1озе(); геблгп О; чоЫ сйескзга~пз(1~з1геата згп) 1оз:;фозгаге т; — тп.гг)згаге(); 1Г(1 а 1оз::еойЫг) сосо « "достигтпт ьОГХп"р е1зе тг(1 а 1оз:: ~а11)>1Г) сопГ « "Нефатальная ошибка ввода/вывода~п"; Глава 9.
Дополнительные воэможности ввода/вывода в С++ 297 е(ае 1й(1 Я 1ов::ЬасИз1с) соц( « "Фатальная ошибка ввода/вывода~в"; Эта программа всегда будет выводить сообшение по крайней мере об одной ошибке. После окончания цикла иЫ)е последний вызов функции сЬесЫ(а|пвО, как и ожцдается, выдаст сообщение о достижении конца файла (символа ЕОЕ). 2.
В следующей программе с помошью функции йоойО файл проверяется на наличие ошибки: ()1пс1ис)е <1овстеаш> (11пс1ис)е <йвСтеаш> па[па патпеарасе эЫ) (п( гаа1п(1пс агдс, с)гаг *аточ[) ) с)тат с)т; 1й(ат9с!-2) сенс « "Содержимое: <иыя файла>~п"; гегпгп 1; 1йв1геатп 1п (агут [1) ); 1~ (! 1п) ( сенс « "Файл открыть невозможно~в"т ге~пгп 1; хп11е(!1п,еоХ()) ( 1п.дел(с)т); // контроль ошибки ай(!1п.лоос(() аа !1п.ео1()) соне « "Ошибка ввода/вывода ... прерывание работы~п"~ гег~тп 1," ) сопл « с[т; 1п.с1оае(); гегпгп О; 1, Добавьте контроль ошибок в ваши ответы на вопросы предыдугцего раздела.
г9В Самоучитель С++ 9.7. Пользовательский ввод/вывод и файлы В предыдущей главе вы изучили перегрузку операторов ввода и вывода для создаваемых вами классов. При этом рассматривался только консольный ввод/вывод. Однако поскольку все потоки С++ одинаковы, то одинаково перегруженная, например, функция вывода, может использоваться без каких-либо изменений для вывода как на экран, так и в файл. Это одна из наиболее важных и полезных возможностей ввода/вывода в С++. Как установлено в предыдущей главе, перегруженные функции ввода/вывода так же, как и манипуляторы ввода/вывода могут использоваться с любым потоком.
Если вы "жестко" зададите конкретный поток в функции ввода/вывода, область ее применения, несомненно, будет ограничена только этим потоком. Следует, по возможности, разрабатывать такие функции ввода/вывода, чтобы они могли одинаково работать с любыми потоками. Е В следующей программе относительно класса соотг перегружаются операторы «и ». Обратите внимание, что одни и те же оператор-функции можно использовать для вывода как на экран, так и в файл. ()тпс1иое <гозсгеага> н(пс1иг)е <йзггеав> пз(пи патезрасе зМ; с1азз соотг) (пг х, у; р\лЬ11с: соогг)(гпс Г, (п( 1) ( х =- 1; у = ); ) Гг(епг) озггеагп аорегаГог«(озегеат азсгеага, соотг( оЪ); гг(епг) (зггсагп аорегасог» (хзсгеата ьзсгеап~, соотг) йоЬ); оз(геагп аорегаеог«(озггеагп йзсгеага, соотг) оЬ) зггсагп « оЬ.х « ' ' «оЬ.у « '~п'; гсгпгп зггеат; гзТгеат йорегаЬог» ()зТгеат йзсгеатп, соогс( аоЬ) зггеав » оЬ.х » оЬ.у; гегпгп зсгеазн в С++ 299 Глава 9.
дополнительные возможности ввода/вывода апс пеуп () соогс1 о1(1, 2), о2 (3, 4); ойзетеатп опе ("ареал")т 1й (!опс) ( соШ « "Файл открыть невозможно~и"; гесиги 1; сиз н сс о1 « о2; опС.с1озе(); 1Езлгеатп 1п ("сезс"); 1л(!1и) ( соШ <с "Файл открыть невозможно ~и"; геьиги 1; соогс( оз(О, О), о4(О, 0) йп»оЗ »о4р соиб « оЗ сс о4( 1п.с1озе(); лепили О; 2. Все манипуляторы ввода/вывода подходят и для файлового ввода(вывода. Например, в представленной ниже переработанной версии одной из программ этой главы, тот манипулятор, который выводит информацию на экран, используется и для ее записи в файл.