Стандартная библиотека Потоковые классы Строковый класс Контейнерные классы Алгоритмы Итераторы Математические классы Диагностические классы Остальные классы ©ρŧą©Павловская Т. А. (СПб. ГУ ИТМО) STL 1
Виды потоков n n n ©ρŧą Поток определяется как последовательность байтов и не зависит от конкретного устройства. Обмен с потоком производится, как правило, через буфер. Чтение данных из потока называется извлечением, вывод в поток — помещением, или включением. По направлению обмена потоки можно разделить на входные, выходные и двунаправленные. По виду устройств, с которыми работает поток, можно разделить потоки на стандартные, файловые и строковые 2
Классы потоков n n n n n ©ρŧą ios — базовый класс istream — входные ostream — выходные iostream — двунаправленные istringstream — входные строковые ostringrstream — выходные строковые stringstream — двунаправленные строковые ifstream — входные файловые ofstream — выходные файловые fstream — двунаправленные файловые 3
Заголовочные файлы n n n n n ©ρŧą <ios> <iosfwd> <istream> <ostream> <iostream> <fstream> <streambuf> <iomanip> 4
Преимущества и недостатки потоков n n ©ρŧą Основным преимуществом потоков по сравнению с функциями ввода/вывода, унаследованными из библиотеки С, является контроль типов, а также расширяемость; потоки могут работать с расширенным набором символов wchar_t. К недостаткам потоков можно отнести снижение быстродействия программы 5
Стандартные потоки Объект n cin n cout n cerr n clog Класс istream ostream операции извлечения из потока >> и помещения в поток << определены путем перегрузки операций сдвига ©ρŧą 6
Операции << и >> n n ©ρŧą Числовые значения можно вводить в десятичной или шестнадцатеричной системе счисления (с префиксом 0 x) со знаком или без знака. Вещественные числа представляются в форме с фиксированной точкой или с порядком. При вводе строк извлечение происходит до ближайшего пробела Значения указателей выводятся в шестнадцатеричной системе счисления. Под любую величину при выводе отводится столько позиций, сколько требуется для ее представления. 7
Форматирование данных В потоковых классах форматирование выполняется с помощью q флагов q манипуляторов q форматирующих методов. ©ρŧą 8
Флаги и форматирующие методы #include <iostream. h> int main(){ long a = 1000, b = 077; cout. width(7); cout. setf(ios: : hex | ios: : showbase | ios: : uppercase); cout << a; cout. width(7); cout << b << endl; double d = 0. 12, c = 1. 3 e-4; cout. setf(ios: : left); cout << d << endl; cout << c; return 0; } ©ρŧą 9
Манипуляторы #include <iostream. h> #include <iomanip. h> int main(){ double d[] = {1. 234, -12. 34567, 123. 456789, -1. 234, 0. 00001}; cout << 13 << hex << ' ' << 13 << oct << ' ' << 13 << endl; cout << setfill('. ') << setprecision(4) << setiosflags(ios: : showpoint | ios: : fixed); for (int i = 0; i < 5; i++) cout << setw(12) << d[i] << endl; return 0; . . . 1. 2340 } 13 d 15. . -12. 3457 ©ρŧą 10
Методы обмена с потоками Программа считывает строки из входного потока в символьный массив. #include "iostream. h" int main(){ const int N = 20, Len = 100; char str[N][Len]; int i = 0; while (cin. getline(str[i], Len, 'n') && i<N){ // … i++; } return 0; } ©ρŧą 11
Пример Программа считывает либо строки, либо целые char str[80], *p; ifstream in("test"); do{p = str; ch = in. peek(); if(isdigit(ch)){ while(isdigit(*p = in. get())) p++; in. putback(*p); *p = '