Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по ООП.doc
Скачиваний:
31
Добавлен:
25.09.2019
Размер:
1.04 Mб
Скачать

45.Последовательность действий при создании ostream.

Потоки обычно связаны с файлами. Библиотека потоков создает стандартный поток ввода cin, стандартный поток вывода cout и стандартный поток ошибок cerr. Программист может открывать другие файлы и создавать для них потоки.

Инициализация Потоков Вывода

ostream имеет конструкторы:

class ostream {

// ...

ostream(streambuf* s); // связывает с буфером потока

ostream(int fd); // связывание для файла

ostream(int size, char* p); // связывет с вектором

};

Главная работа этих конструкторов - связывать с потоком буфер. streambuf - класс, управляющий буферами; он описывается в #8.6, как и класс filebuf, управляющий streambuf для файла. Класс filebuf является производным от класса streambuf.

Описание стандартных потоков вывода cout и cerr, которое находится в исходных кодах библиотеки потоков ввода/вывода, выглядит так:

// описать подходящее пространство буфера

char cout_buf[BUFSIZE]

// сделать \"filebuf\" для управления этим пространством

// связать его с UNIX\"овским потоком вывода 1 (уже открытым)

filebuf cout_file(1,cout_buf,BUFSIZE);

// сделать ostream, обеспечивая пользовательский интерфейс

ostream cout(&cout_file);

char cerr_buf[1];

// длина 0, то есть, небуферизованный

// UNIX\"овский поток вывода 2 (уже открытый)

filebuf cerr_file()2,cerr_buf,0;

ostream cerr(&cerr_file);

Закрытие Потоков Вывода

Деструктор для ostream сбрасывает буфер с помощью открытого члена функции ostream::flush():

ostream::~ostream()

{

flush(); // сброс

}

Сбросить буфер можно также и явно. Например:

cout.flush();

Для файлов

Последовательность действий при создании ostream для именованного файла та же, что используется для стандартных потоков: (1) сначала создается буфер (здесь это делается посредством описания filebuf); (2) затем к нему подсоединяется файл (здесь это делается посредством открытия файла с помощью функции filebuf::open()); и, наконец, (3) создается сам ostream с filebuf в качестве параметра. Потоки ввода обрабатываются аналогично.

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().