Потоковые классы Потоки – последовательности байт, связанные с файлом либо с устройством ввода/вывода. Потоки по направлению обмена делятся на входные, выходные и двунаправленные. По виду устройств, с которыми работает поток выделяют стандартные (передача от клавиатуры и на экран), файловые и строковые (работа с массивами символов).
Иерархия потоков IOS istreamostream iostream ifstream fstream ofstream
Флаги форматирования Определены в классе IOS left/right, dec/oct/hex, uppercase, scientific/fixed и др. Для установки имеется метод setf, для сброса – unsetf. Пример: cout.setf(ios::left); cout
Методы класса IOS int ios::width() – возвращает значение ширины поля вывода; int ios::width(int a) – устанавливает ширину поля вывода; int ios::precision() – возвращает точности при выводе вещественных чисел; int ios::width(int a) – устанавливает ширину поля вывода; char ios::fill() – символ заполнения char ios::fill(char c) – установка символа заполнения
Манипуляторы Манипуляторы – функции, которые включаются в цепочки ввода и вывода для форматирования данных. Манипуляторы определены в заголовочном файле iomanip. Основные манипуляторы endl/ends – символ новой строки/нулевой символ; dec/oct/hex – вывод чисел в десятичной/ восьмеричной/ шестнадцатиричной системе счисления; resetiosflags(long)/setiosflags(long) – сброс/ установка флагов; setw(int) – установка ширины вывода; setprecision(int) – установка количества цифр в дробной части вещественного числа; setfill(int) – установка символа-заполнителя. Пример: cout
Класс iostream Содержит методы для ввода данных >> - форматированный ввод данных всех типов get(с)– считывает символ; get (buf, num, lim=\n) – считывает num-1 символ (или пока не встретится lim) и копирует их в строку buf. Затем к строке дописывается символ \0. getline(buf, num, lim=\n) – аналогична get, но в строку копируется и символ lim. ignore(num=1,lim=EOF) – пропускает num символов. peek() – возвращает символ без удаления его из потока read(buf,num) – считывает num символов в строку buf; readsome(buf,num) – аналогично read, но возвращает количество считанных символов; seekg(pos) – устанавливает указатель чтения на pos; tellg() – возвращает текущую позицию чтения потока
Класс ostream В классе ostream определены методы для вывода:
Стандартные потоковые объекты cin – ввод cout – вывод cerr – вывод сообщений об ошибках clog – вывод в журнал cerr и clog всегда выводят на экран, но первый не использует буфер вывода.
Ошибки потоков В базовом классе ios определено поле state, которое представляет собой состояние потока в виде совокупности битов: enum io_state { goodbit = 0x00, eofbit = 0x01. failbit = 0x02, badbit = 0x04, hardfail = 0x08}; int rdstate() возвращает текущее состояние потока; int eof() возвращает ненулевое значение, если установлен флаг eofbit; int fall() возвращает ненулевое значение, если установлен один из флагов failbit, badbit или hardfail; int bad() возвращает ненулевое значение, если установлен один из флагов badbit или hardfail; int good() возвращает ненулевое значение, если сброшены все флаги ошибок; void clear(int = 0) параметр принимается в качестве состояния ошибки, при отсутствии параметра состояние ошибки устанавливается 0; operator void*() возвращает нулевой указатель, если установлен хотя бы один бит ошибки; operator ! () возвращает ненулевой указатель, если установлен хотя бы один бит ошибки.
Обработка ошибок //Проверка флага if (cin.rdstate() & ios::failbit) … //Сбросить флаг cin.rdstate(cin.rdstate() & ~ios::failbit)… //Установить флаг cin.rdstate(cin.rdstate() | ios::failbit)… //проверка состояния потока while (cin >> x) {}
Файловые потоки ifstream – входной, ofstream – выходной, fstream – двунаправленный. Потоковые классы имеют конструктор без параметров, который создает объект не связывая его с файлом и конструктор с двумя параметрами: fstream(const char* name, int mode) открывающий файл с именем name в режиме mode. Если режим не указан, то файлы откроются по умолчанию в текстовом режиме.
Режимы открытия файлов Режим задается битовыми масками, заданными в классе ios. ios::in – открыть для чтения, ios::out - открыть для записи, ios::ate – встать в конец файла, ios::app – открыть файл для добавления, ios::trunc – удалить файл, если он существует, ios::nocreate – не создавать файл, ios::noreplace – не перезаписывать файл, ios::binary – двоичный режим. Например fstream f(input.txt, ios::in|ios::binary); открывает файл для чтения в двоичном режиме. Для открытия файла можно использовать метод open с параметрами как у соответствующего конструктора. Закрывается файл методом close() или автоматически при вызове деструктора.
Перегрузка операций ввода и вывода class stack { … friend ostream& operator =0; i--) out
Строки Стандартная библиотека C++ включает тип string (строки) в модуле string. Класс string автоматически управляет памятью для строк, определяет большое количество удобных операций и методов.
Конструкторы и присваивание строк string() string( const char*) string (string&) string s1,s2,s3="Hi!"; s1="Hello"; s2=s1;
Операции = присваивание +, += сцепление строк >, =, >
Методы (характеристики строки) length(), size() – длина строки max_size() – максимальная длина строки capacity() – объем памяти, занимаемый строкой empty() - истина, если строка пустая
Методы (присваивание и добавление) Присваивание строки или части строки assign(const string& s) assign(const string& s, int pos, int n) assign(const char *s, int n) Добавление строки или части строки append(const string& s) append(const string& s, int pos, int n) append(const char *s, int n)
Методы (вставка и удаление) Вставка строки или части строки insert( int pos1, const string &s) insert( int pos1, const string &s, int pos2, int n) insert( int pos, const char *s, int n) Удаление части строки erase (int pos = 0, int n = npos) Очистка строки clear()
Методы (замена, обмен, выделение части строки) Замена части строки replace(int pos1, int n1, const string& s) replace(int pos1, int n1, const string& s, int pos2, int n2) replace(int pos1, int n1, const char* s, int n2) Обмен строк swap (string &s) Выделение части строки string substr (int pos = 0, int n = npos) Преобразование строки в char* char* c_str ()
Методы (поиск и сравнение строк) int find( const string&s, int pos = 0) – левое вхождение int rfind( const string&s, int pos = npos) – правое вхождение int compare (const string&s) int compare (int pos1, int n1, const string&s) int compare (int pos1, int n1, const string&s, int pos2, int n2)