Анимация
JavaScript
|
Главная Библионтека В таких случаях следует использовать классы умных указателей, например CountedPtr (см. с. 226) или auto ptr (см. с. 54). Вместо последовательного вывода отдельных символов также можно вывести все содержимое файла одной командой, передавая указатель на потоковый буфер файла в аргументе оператора <<: std::cout « file.rdbufC): Подробности приведены на с. 656. Режимы открытия файлов в табл. 13.32 перечислены флаги управления режимами открытия файлов, определенные в классе ios base. Флаги относятся к типу openmode и группируются в битовые маски по аналогии с флагами fmtflags. Таблица 13.32. Флаги открытия файлов Флаг Описание in Открытие файла для чтения (используется по умолчанию для ifstream) out Открытие файла для записи (используется по умолчанию для ofstream) app Запись данных производится только в конец файла ate Позиционирование в конец файла после открытия («at end») trunc Удаление старого содержимого файла binary Специальные символы не заменяются Флаг binary запрещает преобразование специальных символов или символьных последовательностей (например, конца строки или конца файла). В операционных системах типа MS-DOS или OS/2 конец логической строки в тексте обозначается двумя символами (CR и LF). При открытии фай.да в обычном текстовом режиме (сброшенный флаг binary) символы новой строки заменяются последовательностью из двух символов, и наоборот. При открытии файла в двоичном режиме (с установленным флагом binary) эти преобразования не выполняются. Флаг binary должен использоваться всегда, когда файл пе содержит чисто текстовой информации и обрабатывается как двоичные данные. Пример - копирование файла с последовательным чтением символов и их записью без модификации. Если файл обрабатывается в текстовом виде, флаг binary не устанавливается, потому что в этом случае символы новой строки нуждаются в спе-циа.аьной обработке. В некоторых реализациях имеются дополнительные флаги типа nocreate (файл должен существовать при открытии) и norepiace (файл не должен существовать). Однако эти флаги отсутствуют в стандарте, поэтому их использование влияет на переносимость программы. Флаги объединяются оператором . Полученный результат типа 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() Проверка открытия файла Эти функции используются в основном при создании файловых потоков данных без инициализации. В следующем примере открываются все файлы, имена которых передаются в аргументах, и выводится их содержимое (аналог утилиты cat системы UNIX). 1o/catl.cpp Заголовочные файлы для файлового ввода-вывода #include <fstream> #include <iostream> using namespace std; /* Для всех файлов, имена которых переданы в аргументах командной строки. * - открыть, вывести содержимое и закрыть файл */ int main (int argc. char* argv[]) { ifstream file; Перебор аргументов командной строки for (int i=l; 1<argc; ++i) { Открытие файла file.open(argv[i]); Вывод содержимого файла в cout char с; while (file.get(c)) { cout.put(c): Сброс флагов eofbit и failbit. установленных при обнаружении конца файла file.clearC); Закрытие файла file.closeC): Обратите внимание: после завершения обработки файла вызывается функция с1еаг() для сброса флагов состояния, установленных при обнаружении конца файла. Этот вызов необходим, поскольку потоковый объект используется для нескольких файлов. Функция ореп() никогда не сбрасывает флаги состояния. Следовательно, если поток данных не находится в нормальном состоянии, после его закрытия и повторного открытия вам все равно придется вызвать с1еаг(), чтобы сбросить установленные флагн- То же самое следует сделать и при открытии другого файла. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 [ 196 ] 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |