
- •Объектно-ориентированное программирование
- •Глава 1. Объектно-ориентированный подход.
- •Глава 4. Статические компоненты классов
- •Глава 5. Друзья класса
- •Глава 7. Перегрузка стандартных операторов
- •Глава 8. Классы ресурсоемких объектов.
- •Глава 11. Динамическая идентификация типа (rtti). Операторы приведения типа.
- •Глава 12. Обработка исключительных ситуаций
- •Глава 16. Библиотека ввода-вывода.
- •Глава 17. Контейнеры, итераторы, алгоритмы
Глава 16. Библиотека ввода-вывода.
П.16.1. Иерархия базовых классов ввода-вывода
Стандартная библиотека ввода-вывода С++ представляет собой надстройку над стандартной библиотекой ввода-вывода Си. В библиотеке ввода-вывода С++ есть набор шаблонных классов, инкапсулирующих операции ввода-вывода.
В корне иерархии классов ввода-вывода лежит не шаблонный класс ios_base.
Производным от него является шаблонный класс basic_use, который описывает низкоуровневые операции ввода-вывода.
К
ios_base
basic_ios
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оздают файловые потоки, связывают их с файлами и позволяют указать режим работы. Режим работы указывается как совокупность одного или нескольких базовых режимов. Причем несколько режимов отделяются операцией «поразрядное ИЛИ» (|).
Режимы:
ios::in - разрешает чтение
ios::out - разрешает запись
ios::trunc- усекает файл до нуля в момент открытия
ios::ate- прокручивает файл в конец в момент открытия
ios::app- прокручивает файл в конец, перед каждой операцией записи
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– реализует буфер строкового потока.