- •А. В. Кибардин
- •Оглавление
- •Введение
- •Классы Описание класса
- •Описание объектов
- •Указательthis
- •Конструкторы
- •Конструктор копирования
- •Конструктор копирования для класса monstr:
- •Статические элементы класса
- •Статические поля
- •Статические методы
- •Дружественные функции и классы Дружественные функции
- •Дружественный класс
- •Деструкторы
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Наследование Ключи доступа
- •Простое наследование
- •Правила наследования методов
- •Виртуальные методы и механизм позднего связывания
- •Абстрактные классы
- •Обработка исключительных ситуаций
- •Синтаксис исключений
- •Перехват исключений
- •Список исключений
- •Иерархии исключений
- •Стандартная библиотека
- •Потоковые классы
- •Стандартные потоки
- •Форматирование данных
- •Флаги и форматирующие методы
- •Манипуляторы
- •Методы обмена с потоком
- •Ошибки потоков
- •Файловые потоки
- •Строковые потоки
- •Конструкторы и присваивание строк
- •Операции
- •Функции Присваивание и добавление частей строк
- •Преобразование строк
- •Поиск подстрок
- •Сравнение частей строк
- •Получение характеристик строк
- •Контейнерные классы
- •Последовательные контейнеры
- •Векторы
- •Двусторонние очереди
- •Ассоциативные контейнеры
- •Словари
- •Словари с дубликатами (multimap)
- •Приложение 1. Шаблоны функций
- •Приложение 2. Шаблоны классов
- •Библиографический список
- •В трех частях
Манипуляторы
Манипуляторы – это функции, которые можно включать в цепочку операций помещения и извлечения для форматирования данных. Манипуляторы бывают простые и параметризованные. Манипуляторами пользоваться удобнее чем флагами.
Простые манипуляторы
dec – устанавливает флаг десятичной системы;
oct – устанавливает флаг восьмеричной системы;
hex – устанавливает флаг шестнадцатеричной системы;
ws – устанавливает при вводе извлечение пробельных символов;
endl – при выводе включает в поток символ новой строки и выгружает буфер;
ends – при выводе включает в поток нулевой символ;
flush – при выводе выгружает буфер.
Изменение системы счисления действует до следующего явного изменения.
Пример
…
cout << 13 << hex << ‘ ‘ << 13 << oct << ‘ ‘ << 13 << endl;
…
На экране:
13 d 15
Параметризованные манипуляторы
Параметризованные манипуляторы – это манипуляторы, имеющие аргумент. Для их использования необходимо подключать заголовочный файл <iomanip>.
setbase (int n) – задает основание системы счисления (n = 8, 10, 16 или 0). 0 – основание по умолчанию (десятичное, кроме случаев, когда вводятся восьмеричные или шестнадцатеричные числа);
resetiosflags ( long) – сбрасывает флаги состояния потока, биты которых установлены в параметре;
setfill (int) – устанавливает символ-заполнитель с кодом, равным значению параметра;
setprecision (int) – устанавливает максимальное количество цифр в дробной части чисел;
setw (int) – устанавливает максимальную ширину поля вывода;
setiosflags (long) – устанавливает флаги состояния потока, биты которых в параметре равны 1.
Пример
…
double d (1.234);
cout << setfill (‘.’) << setprecision (4)
<< setiosflags (ios : : showpoint | ios : : fixed);
cout << setw (12) << d << endl;
…
На экране:
……1.2340
Методы обмена с потоком
В потоковых классах наряду с операциями извлечения >> и включения << определены методы для неформатированного чтения и записи в поток (при этом преобразования данных не выполняются). В табл. 4 приводится описание методов.
Таблица 4
Методы потоковых классов
Функция |
Назначение |
1 |
2 |
Класс istream | |
gcount ( ) |
Возвращает количество символов, считанных с помощью последней функции неформатированного ввода |
get ( ) |
Возвращает код извлеченного из потока символа или EOF |
get (buf, num, lim = ‘\n’) |
Считывает num-1 символов (или пока не встретится символ lim) и копирует их в строку buf. Вместо символа lim в строку записывается признак конца строки (‘\0’). Символ lim остается в потоке. Возвращает ссылку на текущий поток |
getline (buf, num, lim = ‘\n’) |
Аналогична get ( ), но копирует в buf и символ lim
|
ignore (num = 1, lim = EOF) |
Считывает и пропускает символы до тех пор, пока не будет прочитано num символов (по умолчанию 1) или не встретится разделитель lim. Возвращает ссылку на текущий поток |
|
|
peek ( ) |
Возвращает следующий символ без удаления его из потока или EOF, если достигнут конец файла |
putback (c) |
Помещает в поток символ с, который становится текущим при извлечении из потока |
read (buf, num) |
Считывает num символов (или все символы до конца файла, если их меньше num) в символьный массив buf и возвращает ссылку на текущий поток |
readsome (buf, num) |
Считывает num символов в символьный массив buf и возвращает количество считанных символов |
seekg (pos) |
Устанавливает текущую позицию чтения в значение pos |
seekg (offs, org) |
Перемещает текущую позицию чтения на offs байтов, считая от одной из трех позиций, определяемых параметром org: ios :: beg (от начала), ios :: cur (от текущей позиции) и ios :: end (от конца файла) |
tellg ( ) |
Возвращает текущую позицию чтения потока |
Класс ostream | |
flush ( ) |
Записывает содержимое потока вывода на физическое устройство |
рut (с) |
Выводит в поток символ с и возвращает ссылку на поток |
seekg (pos) |
Устанавливает текущую позицию записи в значение pos |
seek (ofs, org) |
Перемещает текущую позицию записи на offs байтов, считая от одной из трех позиций (см. выше) |
tellg ( ) |
Возвращает текущую позицию записи потока |
write (buf, num) |
Записывает в поток num символов из массива buf и возвращает ссылку на поток |
Пример 1. Программа считывает строки из входного потока в символьный массив.
# include <iostream.h>
int main ( ) {
const int N = 20, Len = 100;
char str [Len] [N]
int i = 0;
while (cin.getline (str [i], Len, ‘\n’) & & i < N ) {
i ++;}
return 0;
}
Пример 2. Программа формирует файл test, в который вводится три строки (файловые потоки см. далее).
# include <iostream.h>
# include <fstream.h>
# include <string.h>
int main ( ) {
// Запись в файл
ofstream out (“test”);
if (!out) {
cout << “Нельзя открыть файл для записи” << endl;
return 1;
}
char *str [ ] = {“the first line”, “the second line”, “the third line”};
for (int i = 0; i<3, ++ i) {
out.write (str [i], strlen (str [i]));
out.put (‘\n’);
}
out.close ( );
// Чтение из файла
ifstream in (“test”);
if (! in) {
cout << “Нельзя открыть файл для чтения” << endl;
return 1;
}
char check_str [3] [30];
for (int i = 0; i < 3; ++ i) {
in.get (check_str [i], 30);
in.get ( ); }
for (int i = 0; i < 3; ++ i ) cout << check_str [i] << endl;
in.close ( );
return 0;
}
Пример 3. Программа с функциями peek ( ) и putback ( ).
Эти функции позволяют упростить управление, когда неизвестен тип вводимой в каждый момент времени информации. В данной программе из файла считываются либо строки, либо целые числа. Строки и целые числа могут следовать в любом порядке.
# include <iostream.h>
# include <fstream.h>
# include <stdlib>
int main ( ) {
char ch;
// Подготовка файла
ofstream out ("test");
cout << “Нельзя открыть файл test для записи” << endl;
return1;
}
char str [80], *p;
out << 123 << "Это выполняется тест" << 23;
out << "Всем привет" << 99 << “Пока” << endl;
out.close ( );
// Чтение файла
ifstream in ("test");
if (!in) {
cout << "Нельзя открыть файл test для чтения" << endl;
return 1;
}
do {
p = str;
ch = in.peek ( ); // определяем тип следующего значения
if (isdigit(ch)) {
while (isalpha (*p = in.get ( ))) p ++; // считываем целые
in.putback (*p); // возврат символа в поток
*р = '\0'; // заканчиваем строку нулем
cout << "Число:" << atoi (str);
}
else if (isalpha (ch)) { //считываем строку
while (isalpha (*p = in.get ( ))) p ++;
in.putback (*p); // возврат символа в поток
*p = '\0'; // заканчиваем строку нулем
cout << "Строка:" << str;
}
else in.get ( ); // пропуск
cout << endl;
} while (!in.eof ( ));
in.close ( );
return 0;
}
Результат работы программы:
Число: 123
Строка: Это
Строка: выполняется
Строка: тест
Число: 23
Строка: Всем
Строка: привет
Число: 99
Строка: Пока