|
Программирование >> Операторы преобразования типа
open input file ifstream fileCfilenamG.c strC)): Файл открыт? if С! file) { НЕТ, аварийное завершение программы сегг cant open input file \ filename \ endl; exItCEXITJAILURE); Копирование содержимого файла в cout char с: while Cfile.gGt(c)) { cout.putCc): } Автоматическое закрытие файла В функции writeCharsetToRleO конструктор класса ofstream открывает файл с заданным именем: std::ofstream fi1eCfllename.c 5trС)): Имя файла передается в типе string, поэтому его преобразование в const char* выполняется функцией c str() (см. с. 467). К сожалению, у классов файловых потоков данных не существует конструктора, вызываемого с аргументом типа string. После преобразования программа проверяет состояние потока данных: if С! file) { } Если открыть поток данных не удалось, условие будет истинным. После проверки программа в цикле выводит числа от 32 до 255 вместе с соответствующими символами. Внутри функции outputRleO файл открывается конструктором класса ifstream, после чего происходит посимвольная запись нового содержимого файла. В конце обеих функций открытые файлы автоматически закрываются при выходе соответствующих потоков данных из области видимости. Деструкторы классов Ifstream и ofstream закрывают файлы, если они остаются открытыми на момент уничтожения объекта. Если файл должен использоваться за пределами области видимости, в которой он был создан, выделите объект из кучи и удалите его позднее, когда надобность в нем отпадет: std::ofstream* fllePtr = new std::ofstreaniC xyz ): delete filePtr: В таких случаях следует использовать классы умных указателей, например CountedPtr (см. с. 226) или auto ptr (см. с. 54). Вместо последовательного вывода отдельных символов также можно вывести все содержимое файла одной командой, передавая указатель на потоковый буфер файла в аргументе оператора <<: std::cout file.rdbufC): Подробности приведены на с. 656. Режимы открытия файлов В табл. 13.32 перечислены флаги управления режимами открытия файлов, оире-деленные в классе ios base. Флаги относятся к типу openmode и группируются в битовые маски по аналогии с флагами fmtflags. Таблица 13.32. Флаги открытия файлов Флаг Описание in Открытие файла для чтения (используется по умолчанию для ifstream) out Открытие файла для записи (используется по умолчанию для ofstream) арр Запись данных производится только в конец файла ate Позиционирование в конец файла после открытия ( at end ) trunc Удаление старого содержимого файла binary Специальные символы не заменяются Флаг binary запрещает преобразование специальных символов или символьных последовательностей (например, конца строки или конца файла). В операционных системах типа MS-DOS или OS/2 конец логической строки в тексте обозначается двумя символами (CR и LF). При открытии фай.ла в обычном текстовом режиме (сброшенный флаг binary) символы новой строки заменяются последовательностью из Двух символов, и наоборот. При открытии файла в двоичном режиме (с установленным флагом binary) эти преобразования не выполняются. Флаг binary должен использоваться всегда, когда файл пе содержит чисто текстовой информации и обрабатывается как двоичные данные. Пример - копирование файла с последовательным чтением символов и их записью без модификации. Если файл обрабатывается в текстовом виде, флаг binary не устанавливается, потому что в этом случае символы новой строки нуждаются в спе-циа.аьной обработке. В некоторых реализациях имеются дополнительные флаги типа nocreate (файл должен существовать при открытии) и noreplace (файл не должен существовать). Однако эти флаги отсутствуют в стандарте, поэтому их использование влияет на переносимость программы. Флаги объединяются оператором . Полученный результат типа openmode может передаваться конструктору во втором аргументе. Например, следующая команда открывает файл для присоединения текста в конце: std::ofstream fileCxyz.out . std::1os::outstd::i05::арр): В табл. 13.33 представлены различные комбинации флагов и их аналоги - строковые обозначения режимов, используемые функцией открытия файлов fopen() в интерфейсе языка С. Комбинации с флагами binary и ate не приводятся. Установленный флаг binary соответствует строке с присоединенным символом Ь, а установленный флаг ate соответствует позиционированию в конец файла немедленно после открытия. Другие комбинации, отсутствующие в таблице (например, trunclapp), недопустимы.
Открытие файла для чтения и/или записи не зависит от класса соответствующего объекта потока данных. Класс лишь определяет режим открытия по умолчанию при отсутствии второго аргумента. Это означает, что файлы, используемые только классом ifstream или ofstream, могут открываться для чтения и записи. Режим открытия передается соответствующему классу потокового буфера, который открывает файл. Тем не менее операции, разрешенные для данного объекта, определяются классом потока данных. Также существуют три функции для открытия и закрытия фай.дов, принадлежащих файловым потокам данных (табл. 13.34). Таблица 13.34. Функции открытия и закрытия файлов Функция Описание ореп(имя) Открытие файла для потока в режиме по умолчанию ореп(имя, флаги) Открытие файла для потока в режиме, определяемом переданными флагами clQseO Закрытие файлового потока ls open() Проверка открытия файла
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |