Организация работы с файлами
В языке С++ для организации работы с файлами используются классы потоков 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"