Организация работы с файлами

В языке С++ для организации работы с файлами используются классы потоков ifstream (ввод), ofstream (вывод) и fstream (ввод и вывод) (рис. 8).

Перечисленные классы являются производными от istream, ostream и iostream соответственно. Операции ввода−вывода выполняются так же, как и для других потоков, то есть компоненты-функции, операции и манипуляторы могут быть применены и к потокам файлов. Различие состоит в том, как создаются объекты и как они привязываются к требуемым файлам.

В С++ файл открывается путем стыковки его с соответствующим потоком. Рассмотрим организацию связывания потока с некоторым файлом. Для этого используются конструкторы классов ifstream и ofsream:

ofstream(const char* Name, int nMode= ios::out, int nPot= filebuf::openprot);

ifstream(const char* Name, int nMode= ios::in, int nPot= filebuf::openprot);

Первый аргумент определяет имя файла (единственный обязательный параметр).

Второй аргумент задает режим для открытия файла и представляет битовое ИЛИ ( | ) величин:

ios::app при записи данные добавляются в конец файла, даже если текущая позиция была перед этим изменена функцией ostream::seekp;

ios::ate указатель перемещается в конец файла. Данные записываются в текущую позицию (произвольное место) файла;

ios::in поток создается для ввода; если файл уже существует, то он сохраняется;

ios::out поток создается для вывода (по умолчанию для всех ofstream объектов); если файл уже существует, то он уничтожается;

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

ios::nocreate если файл не существует, функциональные сбои;

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

ios::binary ввод−вывод будет выполняться в двоичном виде (по умолчанию текстовой режим).

Возможны следующие комбинации перечисленных выше величин:

ios::out | ios::trunc удаляется существующий файл и (или) создается для записи;

ios::out | ios::app открывается существующий файл для дозаписи в конец файла.;

ios::in | ios::out открывается существующий файл для чтения и записи;

ios::in | ios::out | ios::trunc существующий файл удаляется и (или) создается для чтения и записи;

ios::in | ios::out | ios::app открывается существующий файл для чтения и дозаписи в конец файла.

Третий аргумент – данное класса filebuf используется для установки атрибутов доступа к открываемому файлу.

Возможные значения nProt:

filebuf::sh_compat режим совместного использования;

filebuf::sh_none режим Exclusive: не используется совместно;

filebuf::sh_read режим совместного использования для чтения;

filebuf::sh_write режим совместного использования для записи.

Для комбинации атрибутов filebuf::sh_readи filebuf::sh_write используется операция логическое ИЛИ ( || ).

В отличие от рассмотренного подхода можно создать поток, используя конструктор без аргументов. Позже вызвать функцию open, имеющую те же аргументы, что и конструктор, при этом второй аргумент не может быть задан по умолчанию:

void open(const char* name, int mode, int prot=fileout::openprot);

Только после того как поток создан и соединен с некоторым файлом (используя либо конструктор с параметрами, либо функцию open), можно выполнять ввод информации в файл или вывод из файла.

#include iostream>

#include <fstream>

using namespace std;

#include "string.h"