Г. Шилдт - Полный справочник по C++ (1109478), страница 83
Текст из файла (страница 83)
Кроме того, этот пример показывает, что буфером может служить объект любого типа. Если буфер не является символьным массивом, при вызове функций г а() и ахеян необходимо выпопнягль приведение типов. /7оскольку в языке С++ выполняется строгая проверка типов, указатель одного тилв не может ввпюмвтически првобразовыввпк*ся в указатель другого типа. Если конец файла обнаружится прежде, чем будут считаны пит символов, функция геаа() просто прекратит работу, а в буфере будст записано максимально возможное количество символов. Количество считанных символов можно определить с помощью функции яссипс () . Ее прототип выглядит следующим образом.
й встеаввхге дсоипс()' Данная функция возвращает количество символов, считанных при выполнении последней операции бинарного ввода. Рассмотрим еще один пример использования функций теаа(),мтхсе() и дсоипс(). Юхпс1ибе <ховвтеап> Мхпс1иде <бвстеам> ивхпд патеврасе всбз хпв зпахп() ( доиЬ1е хаим(4) = (99. 75, -34. 4, 1776. О, 200. 1); хпс охввтеапз оиг("пипдзетв", зовззоип ) 1ов:збьпазу)з з.б(!оис) ( соис « "Невозможно открыть файл."з теситп 1з ) сис.мхате((снах *) ай~от, взвеси бпипз) оип.с1ове()з Глава 2!. Файловая система гог(1=0; Гке; 1++) // Очистка массива.
Епвв(1] = 0.0; ггвсгеагв 1п("пвлеэегв", ьов::гп ] Ьов:сбьвагу); гп.геаб((сваг *) аглае, вьгеоГ спит); // Определяем количество считанных символов. сове « 'Считано " « Ьп.дсовпс О « ' байтов.1п"; тог(1=0; 1<4; 1++) // Показать значения, считанные ив файла. сове кс Хпшв(1] « ьп. с1ове () тесвтп 0; ) Зта программа записывав~ массив десятичных чисел на жесткий лиск, а зшвм считывает их обрапю. После вызова функции геад() применяется функция дсовпе(), возврашаюшая количество считанных символов.
~~~1 Дополнительные Функции ЯеЦ) Кроме предыдуших форм функция дее() имеет еше несколько перегруженных разновидностей. Рассмотрим три основных прототипа. ) Ьвстеат адес(сваг *ьи/, всгеаывгве пшп); ьвтгеат атее (с)1аг *Ь»Г, вегеатвьге пипи с)1аг г]е(ап); 1пг дет(); Г!ервая форма функции дее считывает символы из массива, на который ссылается указатель Ьи/', пока не будут считаны пигп-1 символов„обнаружен символ перехода на следуюшую строку или достигнут конец файла.
Функция дее() записывает нулсвои символ в конец массива, на который ссылается указатель Ья/: Символ перехода на новую строку пе счыпыеаепк». Он остается в потоке, пока не будет выполнена следуюшая операция ввода. Вторая форма функции дее считывает символы в массив, на который ссылается указатель Ьи/', пока не будут считаны пигп-1 символов, обнаружен символ де/Ьп или достигн)т конец фаила. Функция дев О записывает нулевой символ в конец массива, на который ссылается указатель Ьи/. Символ г/ейяп из потока ве счигпыеаегпс». Он остается в потоке, пока не булст выполнена слсдуюшая операция ввода.
Третья форма функции дее извлекает из потока следующий символ. Если обнаружен конец файла, она возврашает константу вою Эта форма функции дее() похожа на функцию деес() в языке С. Б® Функция ЯейпеЦ Кроме функции дев О в языке С++ существует функция дее11пе(). Она является членом каждого потокового класса, Ее прототипы выглядят следуюшим образом. 1 Ьвггеап адес11пе(сиаг "Ьи/, вегеаавьге пит); 1всгеап ьдес11пе(сваг *ЬиГ, всгеамвьае пиеа, сваг Ие(йп); Часть й. Язык С++ Первая форма функции дее1>пе считывает символы из массива. на который ссылается указатель Ьи/", пока не будут считаны лиаз-1 символов, обнаружен символ перехода на следующую строку или достигнут конец файла.
Функция дее11пе(> записывает нулевой символ в конец массива, на который ссылается указатель Ьи/: Символ перехода на новую строку извлекается из потока, но ие записывается в буфер. Вторая форлза функции дес11пе считывает символы в массив, на который ссылается указатель Ьи/', пока не будут считаны вилз-1 символов, обнаружен символ з/е[зяз или достигнут конец файла.
Функция дес11пе() записывает нулевой символ в конец массива, на который ссылается указатель Ьи/'. Символ з[е(/лз извлекается из потока, но не записывается в буфер. Как видим, две версии функции дес11пе( > очень напоминают версии дес()зпт, пша) И дее(>зпт, Ппп, ДЕ11п). Оци считывают символы из массива, на который ссылается указатель Ьи/", пока не будут считаны лот-1 символов, обнаружен разлелитель или достигнут конец файла.
Разница заключается в том, что в отличие от функции дев () функция дее11пе( > удаляв~ разделитель из потока. Рассмотрим программу, демонстрирующую работу функции дес11пе(). Она считывает содержимое текстового файла и выводит его на экран. // Программа считывает и выводит на экран // строки, считанные из текстового файла. Вупс1пде <ьозттеаю> Вьпс1иде <тзттеаю> изьпд паюезрасе зтг)з упс кзатп(тпс атдс, с)зат *атдзз[)) ( 15(атдс!=2) соие « "Вызов: Вьзр1ау <имя функции>'зп"з тесцтп 1з ) 1тзстеат ьп(атдт[1))з // Ввод 1т(!зп) сопт « "Невозможно открыть файл.
1п"з тееитп 1; ) с)зат ест[255) з иН11е(ьп) ( тп.дее11пе(зет, 255)з // По умолчанию йе11в ьт(>п) сопс «зст «епс)1з ) зхз.с1озе()з тегцтп Оз ) :.~ Распознавание конца файла Распознать конец файла можно с помощью функции вод( >, имеющей прототип >( )зоо1 еоз () з Глава 2(. Файловая система Если достигнут конец файла, она возврашаст значение етое, в противном случае она возврашает значение да1яе. Применение функции еое() иллюстрируется следующей программой, которая выводит на экран содержимое фаила в шестнадцатеричном формате и в виде АБСП- кодов. (Сохранен текст оригинала.
— Прим. дед.) /* Озяр1ау сопсепгя о6 ярес1Нео 611е 1гз )зог)з А5011 ап<) ап Ьех. */ $1пс1иг)е <тоясгеаяз Мтпс1пз)е <Хясгеааз> $1пс1пг)е <сссуре> Вапс1пг)е <аопаптр> ояапд пазаеярасе ясг)з гпг азагп(зпс атдс, с)заг *агдзз(]) ( 16(агдс(=2) ( сост « "цяадез Шяр1ау <611епаве>1зз"з тегпгп 1з ) 16ястеааз 1п(агдзз( 1), тояззтп ~ зояз:Ьгпагу)з 16()1п) ( сонг « ".Оагзпое преп торце 611е.(п"з гегсгп 1; гедзясет 1ззс з, упт сосне = 0; с)зат с(16] з сопя.явей(тояззпррегсаяе); ьиз1е(!зп.еог()) ( 6от(т=Оз 1<16 аа ) ьп.еоЕ()з 1++) зп.дег(с[з])з ) 16(1<16) т —; // дев гаг) ое ео6 бог(1 =Оз з<тз з++) соса «яесззз(3) «)зех «(1пг) с(з] з тот(з З<16з 1++) соне « сопс « " 1с"з бог(З=ОЗ З<з/ З++) за(дяргапе(с(З])) соне « с(З); е1яе попс « сопс «епг)1з соппс++з 16(союзе==16) ( соппс = Оз сонг « "Ргеяя еытни го сопетгюез сз.п.дег()з сопс « епз)1/ ) ) Часть! 1.
з(амк С++ 1п.с1ове() теептп 0; ) Если в качестве параметра этой программы задать ее исходный файл, на экране появятся следующие результаты. -Й Функция щпогеЦ С помогцью функции 1дпоте() можно считать и проигнорировать символ из входного потока. й зветеав 61дпоте(вттеавв1те пиза=1, 1пт Суре г(е(нн=ЕРЕ) Она считывает и отбрасывает символы, пока не будут пропущены линз символов (по умолчанию параметр лит равен 1) или не встретится символ дейл, который по умолчанию равен константе еое. Обнаруженный разделитель не удаляется из потока ввода.
Тип 1пе суре определен как разновидность типа Епе. Следующая программа считывает файл ТЕЯТ. Она игнорирует символы, пока не встретится пробел или не будут считаны 10 символов. Затем она выводит на экран остальную часть файла. №апс1пг)е <уоветеав> №Впс1пг)е <бветеазз> пвьпд павеврасе всг)з 1 с 1пО ( 1йвстеав Вп( севе'); 16(! зп) ( сопс « "Невозможно открыть 4зайл.1п"з теептп 1з ) /* Игнорируются 10 символов, пока не встретится пробел.
*/ 1п.адгзоте(10, ' ')з сиат с; иб11е (1п) Глава 21. файловая система 28 2А 20 ВЕ 74 73 20 бб 69 68 20 41 65 78 2Е 65 20 ЗС ВЕ 63 ВС Р А 23 70 65 ЗЕ бу 6Р 61 61 69 6Е 61 72 20 20 20 69 20 20 78 20 22 55 20 ЗС 66 44 69 20 бв БС 65 53 43 Р А 69 бв 75 64 69 ВЕ Р А бЕ 69 28 69 2А 61 66 28 73 61 69 6С 73 70 66 20 Р А 49 49 2А 28 73 74 65 20 63 6С 23 69 70 ЗЕ ВЕ 74 72 67 61 72 20 20 67 65 65 бЕ 6С 61 73 70 20 20 20 61 Р А 72 65 ЗС бб 75 64 6Е 63 Р А 20 61 76 58 67 63 20 20 ЗА 20 61 ВР 79 20 65 63 20 69 68 64 23 69 61 6Р 73 74 65 20 6С 75 Р А 72 67 5Р 29 21 ЗР 63 бу 44 69 65 ЗЕ 63 68 69 66 ВЕ 20 20 69 6Е 63 ЗЕ Р 72 65 ЗС 63 64 65 69 6Е 63 2С Р А 32 29 75 74 73 70 5С 6Е 6Е 74 65 69 65 64 62 68 74 ВЕ 20 68 бС 75 64 А 23 69 61 6Р ЗЕ 63 74 79 20 ЗС 69 74 20 6Р 20 63 68 78 Р А 20 Р А 20 ЗС ЗС ВС 61 79 22 ЗВ Р /* Равр1ау сопее пев ог ересь Вью гз1е..
1п Ьос Н АВС11 апг) зп Ь ех...*/..№Впс1пд <зовстеат>..№з. пс1пг)е <бвстеав> ..№Впс1пг(е <сосу ре>..№зпс1пде <з овапьр>....гпт в атп(гпе атдс, сй ат *атдзг[))..( 11(атдс!=2) (.. сопс « "Рвадез Рзвр1ау <111епаве>1п"з. гп.пес(с>! гт(тп) оопп « с; ) 1п.с1оее(! теептп 0; ) ~~ Функции рееЩ и рШЬасКО Можно считать слслующий символ из потока, нс извлекая его оттуда. Для этого предназначена фу!!кция рваМ >, имеющая прототип, приведенный ниже. Я гпс суре рееК( >; Эта функция возвращает следующий символ из потока ввода или признак конца файла.
Тип дпс суре определен как разновидность типа дпс Символ, считанный из потока послелним„можно вернуть обратно с помощью функции рпе>засК( >. Ее прототип имеет следующий вид, Я геетеам арпСЬасК(спат г); Здесь параметр г означает символ, считанный последним ~~ Функция ПивйЦ При выводе данные не сразу перслаются Физическому устройству, связанному с потоком.
Вместо этого они накапливаются во внутреннем буфорс, пока он нс заполнится. Однако существует способ принудительно записать информацию из буФера на лиск, не дожидаясь его заполнения Для этого предназначена функция д1пв)з(). Ес прототип имеет следующий вил. $ оестеат ат1пзп(>; Функцию д1пв>г следует вызывать, когда программа выполняется в неблагоприятных условиях (например„если часто происходят сбои питания). Закрытое файла или прекращение работы программы такие очшцает еге буферы.
~1Ы Произвольный доступ Произвольный досзуп к файлу обеспечивается функциями вевкяО и веекр(). Их прототипы имеют следующий вид. дастеат аяеекд(отт Суре о>Ухе>, еееКг(гт олх(к>; олетеаж аееекр(сГГ Суре о))ке>, вееКЙ>т ое!д!н>; Тип еде суре является разновидностью целого типа.