Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП (С++) Лекции Бобин.doc
Скачиваний:
57
Добавлен:
08.02.2015
Размер:
625.66 Кб
Скачать

Глава 16. Библиотека ввода-вывода.

П.16.1. Иерархия базовых классов ввода-вывода

Стандартная библиотека ввода-вывода С++ представляет собой надстройку над стандартной библиотекой ввода-вывода Си. В библиотеке ввода-вывода С++ есть набор шаблонных классов, инкапсулирующих операции ввода-вывода.

В корне иерархии классов ввода-вывода лежит не шаблонный класс ios_base.

Производным от него является шаблонный класс basic_use, который описывает низкоуровневые операции ввода-вывода.

К

ios_base

basic_ios

basic_ostream

basic_istream

basic_iostream

лассbasic_ostreamописывает понятия потока вывода (записи). Классbasic_istreamописывает понятия потока ввода (чтения). Эти классы шаблонные. Классbasic_iostreamинкапсулирует операции ввода-вывода.

Первый параметр шаблонов описывает представление одиночного символа с точки зрения ввода-вывода. По аналогии с строками в стиле С++ существует 2 стандартных варианта: один из них описывает операции с ASCII, а другой сUNICODE.

char -> ASCII

wchar_t -> UNICODE

п.16.2.Стандартные потоки ввода-вывода

В библиотеке ввода-вывода определены 4 глобальные переменные:

istream cin;

ostream cout;

ostream cerr;

ostream clog;

wistream wcin;

wostream wcout;

wostream wcerr;

wostream wclog;

п.16.3. Операторы ввода-вывода

cout << “Привет!”;

<< - оператор сдвига влево

Это поразрядная операция

unsigned x = 2; // 0..0010

x = x << 1; // x = 4

>> - оператор сдвига вправо

В стандартной библиотеке С++ операции сдвига перегружаются и играют роль операторов ввода-вывода применительно к базовым классам.

cout << x && y; // не скомпилируется

Оператор сдвига имеет приоритет меньше, чем логическое И.

поток >> перменная; // вывод

поток << переменная; // ввод

cout << x; // бинарный оператор

поток << переменная << переменная;

Результат работы первого оператора будет поток. Оператор вывода должен возвращать ссылку на поток и принимать ссылку на подготовленный поток

ostream & operator << (ostream &out, const тип&value)

{

...

return out;

}

Пример:

ostream & operator << (ostream & out, const Point &value)

{

out << value.x << “, “ << value.y;

return out;

}

...

Point p(1, 2);

cout << p << endl;

Аналогично можно перегрузить оператор ввода.

istream & operator >> (istream &in, тип&value)

Пример:

istream & operator >> (istream &in, Point &value)

{

in >> value.x >> value.y;

return in;

}

...

Point p(1, 2);

cin >> p;

Как правило, операторы ввода-вывода необходимо делать дружественной функцией нашему классу.

Заголовочный файл - <iostream>.

п.16.4. Манипуляторы.

Манипулятор – объект, который изменяет состояние потока.

cout << “Hello” << endl;

endl – манипулятор, который осуществляет вывод символа новой строки и осуществляет синхронизацию потока с устройством.

На самом деле endl– функция.

ostream & endl(ostream &out)

{

out << “\n”;

out.flush();

return out;

}

Можем создавать собственные манипуляторы.

ostream & operator << (ostream &out, ostream &(* manip)(ostream &))

{

return manip(out);

}

Это простые манипуляторы (без параметров).

Манипуляторы с параметрами:

cout << manip(1, 2, 3) << ...;

Как правило, создается класс:

class manip

{

public:

manip(int a, int b, int c);

...

friend ostream & operator << (ostream &, const manip &)

};

п.16.5.1. Файловые потоки ввода-вывода

Для взаимодействия с файлами в библиотеке С++ есть частные случаи потоковых классов, ориентированые на обмен файлов.

Определены в файле <fstream>.

basic_istream

basic_ostream

basic_iostream

basic_ofstream

basic_ifstream

basic_fstream

Эти классы являются производными. каждый класс имеет по частные реализации для работы с ASCII/UNICODE.

п.16.5.2. Создание файловых потоков

Конструкторы умолчаний этих классов создают файловые потоки, не связанные с каким-либо файлом.

ifstream::ifstream(const char *fileName)

Данный конструктор создает файловый поток, связанный с указанным файлом и открывает файл в режиме чтения.

ofstream::ofstream(const char *fileName)

Открывает файл в режиме записи.

fstream::fstream(const char *fileName, unsigned mode)

ifstream::ifstream(const char *fileName, unsigned mode)

ofstream::ofstream(const char *fileName, unsigned mode)

Cоздают файловые потоки, связывают их с файлами и позволяют указать режим работы. Режим работы указывается как совокупность одного или нескольких базовых режимов. Причем несколько режимов отделяются операцией «поразрядное ИЛИ» (|).

Режимы:

  1. ios::in - разрешает чтение

  2. ios::out - разрешает запись

  3. ios::trunc- усекает файл до нуля в момент открытия

  4. ios::ate- прокручивает файл в конец в момент открытия

  5. ios::app- прокручивает файл в конец, перед каждой операцией записи

  6. ios::binary- обеспечивает работу с файлами в двоичном режиме

Пример:

fstream f(“test.txt”, ios::in | ios::out | ios::trunc);

п.16.5.3. Уничтожение файлового потока

Деструктор файлового потока автоматически закрывает файл, с которым был связан поток.

п.16.5.4. Дополнительные методы

bool is_open() – метод присутствует в 3 классах и позволяет узнать, открыт ли файл

open

close

Смысл такой же, как у конструктора общего вида и деструктора.

п.16.6. Строковый ввод-вывод

В качестве внешнего хранилища данных можно использовать не только файлы, но и строки в стиле С++.

basic_istream

basic_ostream

basic_iostream

basic_ostringstream

basic_istringstream

basic_stringstream

Определены в файле <sstream>.

п.16.7. Буферизованный ввод-вывод

Внутренняя структура потоковых классов и внутренняя логика их работы в общем случае неизвестны. Программисту доступны только те высокоуровневые средства, которые необходимы ему для решения прикладных задач. Используя операторы ввода-вывода и компонентные функции библиотеки классов, программист обычно не знает, с чем конкретно работает (с файлом, с консолью, с устройством, с новым классом). Непосредственное выполнение операции ввода-вывода возлагается на объекты особых типов – буферы потоков.

Буферы потоков напрямую взаимодействуют с памятью и внешними устройствами. Они предоставляют потоковым классам набор простейших операций для реализации ввода-вывода.

Понятия буфера потока реализуется шаблонным классом basic_streambuf, от которогог наследуется 2 частных случая.

basic_streambuf

basic_filebuf

basic_stringbuf

basic_filebuf– реализует буфер файлового поттока.

basic_streambuf– реализует буфер строкового потока.