Открытие файлов в разных режимах
Точные детали того, как открываются и закрываются файлы, различаются в разных операционных системах. Поскольку после включения <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();