Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Классы потоков С++.doc
Скачиваний:
10
Добавлен:
01.09.2019
Размер:
110.08 Кб
Скачать

Открытие файлов в разных режимах

Точные детали того, как открываются и закрываются файлы, различаются в разных операционных системах. Поскольку после включения <iostream.h> становятся доступны cin, cout и cerr, во многих (если не во всех) программах не нужно держать код для открытия файлов. Вот, однако, программа, которая открывает два файла, заданные как параметры командной строки, и копирует первый во второй:

01 #include <iostream.h>

02 void error(char* s, char* s2)

03 {

04 cerr << s << " " << s2 << "\n";

05 exit(1);

06 }

07 main(int argc, char* argv[])

08 {

09 if (argc != 3) error("неверное число параметров","");

10 filebuf f1;

11 if (f1.open(argv[1],input) == 0)

12 error("не могу открыть входной файл",argv[1]);

13 istream from(&f1);

14 filebuf f2;

15 if (f2.open(argv[2],output) == 0)

16 error("не могу создать выходной файл",argv[2]);

17 ostream to(&f2);

18 char ch;

19 while (from.get(ch)) to.put(ch);

20 if (!from.eof() && to.bad())

21 error("случилось нечто странное","");

22 }

Последовательность действий при создании ostream для именованного файла та же, что используется для стандартных потоков:

  • сначала создается буфер (здесь это делается посредством описания filebuf);

  • затем к нему подсоединяется файл (здесь это делается посредством открытия файла с помощью функции filebuf::open());

  • создается сам ostream с filebuf в качестве параметра.

Потоки ввода обрабатываются аналогично.

Файл может открываться в одной из двух мод:

enum open_mode { input, output };

Действие filebuf::open() возвращает 0, если не может открыть файл в соответствие с требованием. Если пользователь пытается открыть файл, которого не существует для output, он будет создан.

Используя классы ifstream и ofstream - производные от istream и ostreasm, описанные в fstream.h, можно открывать файловые потоки в разных модах с помощью флагов конструктора потока:

ofstream object (filename, flag)

где flag может принимать следующие значения:

ios::app запись в конец существующего файла;

ios::ate после открытия файла перейти в его конец;

ios::binary открыть файл в двоичном режиме (по умолчанию - текстовый);

ios::in открыть для чтения;

ios::nocreate сообщать о невозможности открытия, если файл не существует;

ios::noreplace сообщать о невозможности открытия, если файл существует;

ios::out открыть для вывода;

ios::trunc если файл существует, стереть содержимое.

При необходимости изменить способ открытия или применения файла можно при создании файлового потока использовать два флага или более флагов: ios::app|ios::noreplace.

Для открытия файла одновременно на чтение и запись можно использовать объекты класса fstream:

fstream object(filename, ios::in|ios::app);

Перед завершением программа проверяет, находятся ли потоки в приемлемом состоянии. При завершении программы открытые файлы неявно закрываются. Для явного закрытия объектов файловых потоков применяется метод close():

object.close();