Г. Шилдт - Полный справочник по C++ (1109478), страница 39
Текст из файла (страница 39)
Наиболее часто файлом считается физический файл, расположенный на диске. Именна такие файлы мы булем иметь в виду в ходе дальнейшего изложения. Прототип функции корен() имеет. следующий вид. й Рабе "бореп(попас спас *шп фтмл, сопвс спас "релснв) Здесь параметр имя файла представляет собой указатель на строку символов, которая задает допустимое имя файла и может включать в себя описание пути к нему. Строка. на которую ссылается указатель релгич, определяет предназначение файла. Допусти- мыс значения параметра режим представлены в табл.
9.2. Таблица 9.2. Допустимые значения параметра режим Значение Открыть текстовый файл для чтения Создать твкстовыи файл для записи Добавить записи в конец текстового файла Открыть бинарный файл для чтения Создать бинарный файл для записи Добавить записи в конец бинарного файла Открыть текстовый файл для чтения и записи Создать текстовый файл для чтения и записи Добавить записи в конец текстового файла или создать текстовый файл для чтения и записи Открыть бинарный Файл для чтения и записи Создать бинарный Файл для чтения и записи Добавить записи в конец бинарного файла или создать бинарный Файл для чтения и записи к+Ь а+Ь Как указывалось ранее, функция ворон() возвращает указатель файла.
Не следует изменять значение этого указателя в собственной программе. Если во время от.крытия файла произойдет ошибка, функция лорел( ) вернет нулевой указатель В приведенном ниже примере функция ворон() используется лля открытия файлз с именем ТЕВТ. Е11Е *бр; бр = борен("севе", "ы"); Этот фрагмент программы абсолютно верен, и все же файл л)ожно открыть намного грамотнее.
Например, так. *бр; зб ((бр = бореп("сева","ы"))==ьцъь)( ркйпсб("невозможно открыть Файл.~п')г ехз.г (1); Теперь можно обнаружить ошибку, возникшую при открьггии файла, например, попытку открыть файл, зашишенный от записи, или переполнение диска, и правильно Глава 9. Файловый ввод-вывод и используется соответствуюшим потоком при выполнении операций ввода-вывода. Выполнить эти операции без указателя фзйла невозможно. Чтобы объявить указатель фата, следует выполнить следуюшнй оператор. $ ЕП,Е *бр; на нее отреагировать.
В принципе, прежде чем приступать к выполнению операций ввода-вывода, следует всегда проверять, успешно лн выполнена функция Еореп(). Хотя большинство значений параметра режим имеют вполне очевидный смысл, некоторыс из них требуют дополнительных разъяснений. Если при попытке открыть файл только для пения выяснится, чзо такого файла на лиске нет, функция Еореп(] вернет признак ошибки. Если попытаться открыть несуществующий фаил лля добавления записей, он будет создан. Кроме лого, если для добавления открыть существующий файл, все новые записи будуг записаны в его конец. Исходное содержание файла останется неизменным Если несуц(ествуюший файл открывается для записи, он также создается.
Если для записи открывается сушествуюц(ий файл, его содержимое уничтожается и заменяется новыми данными. Разница между режимами г+ и в+ заключается в том, что при попытке открыть несуществующий файл в режиме к+ новый файл пе созлается, в отличие от режима в+. К тому же, если файл ранее существовал, то в режиме м+ его содержимое будез. уничтожено, а в режиме к+ — нет. Как следует из табл. 9.2, файл можно открыть как в текстовом, так и в бинарном режилю. Как правило, команды возврата каретки и прогона бумаги в текстовом режиме переводятся в символы перехода на новую строку.
При выводе все происходит наоборот: символы перехода на новую строку интерпретируются как команды перевода каретки и прогона бумаги. При работе с бинарными фаилами такие преобразования не выполняются. Количество одновременно открытых файлов определяется конспвпой жоршя мдх. Как правило, она равна 8, но ее точное значение следует покаюсь в документации, сопровожлаюшей компилятор. Закрытие файла Функция Ео1овв() закрывает поток, открытый ранее функцией Еореп(). Она записывает все оставшиеся в буфере данные в файл и закрывает его, используя команды операционнои системы. Ошибка, возникшая при закрытии файла, може~ породить множество проблем, начиная с потери данных и разрушения файлов и заканчивая непредсказуемыми послелствиями для программы.
Кроме того, функция Ео1оее() Освобождает упраяляюший блок фаила, связанного с потоком, позволяя использовать этот блок повторно. Операционная система ограничивает количество одновременно открытых файлов, поэтому, прежде чем открыть один файл, следует вскрыть другой, Прототип функции Ео1оее() вьплядит следующим образом. й 1пе Ес1оае(К1ЬЕ ")р) Здесь параметрУр представляет собой указатель файла, возвращенныи функцией Еорвп(). Если функция вернула нулевой указатель, значит, файл закрыт успешно.
Значение дог является признаком ошибки. Для распознавания и обработки возникших проблем можно использовать стандартную функцию Ееккоко. Как правило, функция Ео1оев() выполняется неверно, если диск был прежаевременно вынтт из лисковода или переполнен. Запись символа Для вывода символов предназначены две функции: рпео() и Ерпеео. (На самом деле рпео() — это макрос.) Эти эквивалентные функции просто сохраняют совместимость со старыми версиями языка С.
В книге используется макрос рпео(), хотя с таким же успехом можно было бы вызывать функцию Ерове() . Функция рпеоО записывает символ в файл, открытый с помощью функции еореп(). Прототип этой функции выглядит так. Часть (. Основы языка С++; подмножество С 5 1пс рисе(1пс ывявов, Р1ье 'Гп) Здесь параметр Гр представляет собой указатель файла, возврашеццый фуикцией (ерепО, а аргумспт сА является символом, поллежашим выводу.
Указатель фа(юа сообшает функции расе О, в какой именно файл следует произвести запись. Несмотря па то что параметр сй имеет тип зпе, в файл записывается лишь младший байт. Если функция рцсс0 выполнена успешно, она возврашает символ, записанный сю в файл. В противном случае опа возврашает константу еое.
Чтение символа Ввод символа осушествляется двумя эквивалентными функциями: деве о и Едесе () . Наличие одинаковых функций позволяет сохранить совместимость со старыми версиями языка С. В дальнейшем мы будем использовать лишь функцию дассо, которая реализована в зиле макроса, При желании можно применять и функцию едесе () . Фуикция веге() считывает символ из файла, открытого функцией дерево в режиме чтения.
Прототип функции дега(1 имеет следуюший вид. В ьпг дегс(ЯХЬЕ *)р) Здесь параметр Гр является указателем файла, возврац(ецпым функцией торец(). Функция деево возврашает целочисленную перемеыпую, младший баит которой содержит введенный символ. Если возникла ошибка, старший байт этой перемен~ юй равен пулю. Если при чтении обнаруживается конец файла, функция деве() возврашает коистш)ту еое. Следовательцо, лля считывания данных вплоть до конца файла можно применять следующий фрагмент программы.
) в ас ( сп = дегс(тр)в ыд11е(сп(=ЕОР)в Однако функция деве() возврашает константу еое и при возникновении ошибок. Для распознавания ошибки можно применять функцию Евккек() . Применение функций 1орепЦ, Яе1сЦ, рйсЦ и 1с!ове() Функции терапии, десс(), рпсс0 и Ее1еве() образуют минимальный набор процслур лля работы с файлами. Приведсииая ниже программа КТО0 иллюстрируе~ применение функций риса(), дерев() и Ес1ове().
Опа считывает символы с клавиатуры и записывает их в файл, пока пользователь пе введет символ д Имя файла задается в командной строке. Например, вызвав программу КТО0 с помошью команды ктор ткет, люжцо записать текст в файл с именем тевт. т* программа ктоп лля рабв ты с диском. */ тьпс1пде ввгг)то.п> Взпс1пбе <зев)11Ь.Ь> тпс гваьп(тпс атдс, сват "агду[)) 'тр спас с)ы 11(атдс[Г2) ( ртьпгь"("Еы забыли указать кмя Файла.ьп") ехьс (1); Глава 9.
Файловый ввод-вывод ьс((тр=ьореп(агдч[1), "н"))==и()Ь?,) ( ргьпСГ("Невозможно открыть Файл.~п")г ехьс(1); ((о ( сн = дееснаг(); риес(сн, ьр); юц11е (с?1 != '6') тс1озе(тр): гесихп 0; ) Программа ОТОа выполняет противоположные операции: она считывает произвольный текстовый файл и выводит его содержимое на экран. Она демонстрирует использование функции едеес () . У* Программа ПТОЯ считывает Файл и выводит его на экран. */ Ззпс1пс)е <зес)ьо.й> Оапс1ог)е <вег)11Ь. Ь> ьпс таьп(1пс агдс, снаг *агдч[)) ( ЯХВЕ *Хр; сцаг сйг 11(агдс!=2) ( ргапст("Вы забыли ввести имн файла.~п"); ехьс(1); ) ьт((ср=сореп(агдч[1), "г"))==НОВ() ( рг[пст("Невозможно открыть файл.~п")г ехьс<1); ) сн = десс(ьр); у' Считываем символ */ юи11е (сп!=ВОР) ( риьсйаг(сй); /* Выводим его на экран *Г сй = десс(йр); ) ьс1озе(гр); геспгп О; Чтобы выполнить тестирование этих программ, слелует сначала созлать текстовый файл с помощью программы КТОО, а затем считать его содержимое, используя программу ОТОа.