logo
шпоры по ООП

46.Открытие и закрытие файла.

Как уже указывалось ранее, каждая программа на С++ может использовать предопределенные потоки - стандартный вывод (cout), стандартный ввод (cin) и стандартные потоки ошибок (cerr, clog). Соответствующие объекты создаются системой автоматически. Чтобы работать с какими-либо устройствами или файлами надо создать потоки и привязать их к этим устройствам или файлам. Далее и будет рассматриваться этот механизм.

Для работы с файлами в С++ обычно создаются объекты следующих классов:

ifstream - для операций с входным дисковым файлом;

ofstream - для операций с выходным дисковым файлом;

fstream - для операций ввода и вывода с дисковым файлом.

Как указывалось ранее, эти классы являются производными соответственно от классов istream, ostream и iostream. Таким образом, они наследуют все описанные выше функциональные особенности своих базовых классов: перегруженные операции << и >> для встроенных типов, функции ввода-вывода, состояния потока, функции и флаги форматирования, манипуляторы.

Для каждого из трех классов файловых потоков предусмотрены конструкторы (всего по 4 конструктора, из которых рассмотрим по 2):

1) для создания объекта без открытия файла: ifsteram(), ofstream(), fstream();

2) для создания объекта с открытием файла:

ifstream(char *name,int omode=ios::in,int prot=filebuf::openprot);

ofstream(char *name,int omode=ios::out,int prot=filebuf::openprot);

fstream(char *name,int omode,int prot=filebuf::openprot);

где

name - имя файла;

omode - режимы открытия файла, определяемые как совокупность флагов:

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

ios::out - открытие для записи;

ios::ate - переход после открытия на конец файла (как для входных, так и выходных файлов);

ios::app - добавление записей к файлу;

ios::trunc - уничтожение содержимого, если файл существует (подразумевается, если задано ios::out и не заданы ни ios::ate, ни ios::app);

ios::nocreate - открываемый файл должен существовать;

ios::noreplace - открываемый файл не должен существовать;

ios::binary - открытие двоичного файла, иначе файл открывается в текстовом режиме.

Различие между текстовым и двоичным режимом: для текстовых файлов каждая пара символов "\r\n" (возврат каретки/перевод строки) при вводе преобразуется в единственный символ '\n', а при выводе наоборот. Для двоичных файлов преобразование не выполняется;

prot - определяет режим доступа для вновь создаваемых файлов. По умолчанию filebuf::openprot = S_IREAD | S_IWRITE, что позволяет читать и модифицировать файл.

Если файловый поток создается без открытия файла (первым из указанных конструкторов), то для последующего открытия файла и связи с ним объекта-потока можно использовать метод

open(char *name,int omode,int prot=filebuf::openprot).

Закрытие файлов выполняется автоматически в деструкторах классов - файловых потоков, но может быть выполнено и с помощью метода close().