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

Конструкторы файловых потоков.

Если Вы посмотрите, как описаны классы ifstream, ofstream, fstream, обратите внимание на перегруженные конструкторы (для каждого из файловых классов предусмотрено 4 конструктора), например, наиболее используемые из них:

имя_класса ();

имя_класса (char*, int, int, int);

и т.п.

Например, для класса fstream:

fstream() - создает поток, не открывая файла;

fstream(const char* name, // имя файла

int omode, // режим открытия

int = filebuf::openprot // защита файла

) - создает поток, открывает файл и связывает его с потоком;

fstream( int f // дескриптор файла

) - создает поток и связывает его с уже открытым файлом

fstream( int f,

char *buf, // буфер

int len // размер буфера

) - то же, что предыдущий конструктор, но потоку назначается буфер.

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

ofstream outf; // определяется выходной файловый поток

ifstream inf; // определяется входной файловый поток

fstream iof; // определяется файловый поток для ввода и вывода

Параметр omode - дизъюнкция флагов, определяющих режим работы с откываемым файлом (например, только запись). Флаги определяются в файле ios.h (см. перечислимая константа open_mode).

enum open_mode {

in = 0x01, // открыть только для чтения

out = 0x02, // открыть только для записи

ate = 0x04, // установить указатель на конец файла

app = 0x08, // дописывать данные в конец файла

trunc = 0x10, // усечь файл до нулевой длины

nocreate = 0x20, // если файл не существует, ошибка открытия

noreplace = 0x40, // если файл уже существует, ошибка открытия

binary = 0x80 // открыть файл для двоичного обмена

};

Для файла ifstream по умолчанию параметр omode = ios::in, для класса ofstream по умолчанию параметр omode = ios::out.

Функции для открытия и закрытия файлов.

Создание файлового потока (объекта соответствующего класса) связывает имя потока с выделяемым для него буфером и инициализирует переменные состояния потока. Так как файловые классы являются производными от классов ostream, istream, stream, то они поддерживают форматированный и бесформатный обмен с файлами. Но прежде чем выполнить обмен, необходимо открыть соответствующий файл и связать его с файловым потоком.

"Присоединить" файловый поток к конкретному файлу можно с помощью компонентной функции open(). Функция open() унаследована каждым из файловых классов ofstream, ifstream, fstream от класса fstreambase. Формат функции (такой же, как у второго конструктора fstream):

void open(const char *fileName, int mode = значение_по_умолчанию,

int protection = значение_по_умолчанию);

fileName - имя уже существующего или создаваемого заново файла. Это строка, которая задает полное или сокращенное имя файла в формате, определенном операционной системой.

Как обычно вызов функции open() осуществляется с помощью уточненного имени

имя_объекта_класса.вызов_принадлежащей_классу_функции

Например,

outf.open("d:\\temp\\file1.txt");

inf.open("file2.txt");

iof.open("file3", ios::app);

Чтобы проверить, удачно ли завершена функция open(), используется перегруженная операция !. Если ошибок не было, то выражение !имя_потока имеет нулевое значение, в противном случае - значение, отличное от нуля.

// ...

if (!inf)

{

cout << "Can't open! ";

return;

}

// ...

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

Все файловые классы унаследовали от базовых классов функцию close(), которая очищает буфер потока, отсоединяет поток от файла и закрывает файл. Функцию close() необходимо явно вызывать при изменении режимов работы работы с файловым потоком. Автоматически эта функция вызывается только при завершении программы.