Скачать презентацию Стандартная библиотека Стандартную библиотеку С можно разделить на Скачать презентацию Стандартная библиотека Стандартную библиотеку С можно разделить на

Лекция_8_Потоки.ppt

  • Количество слайдов: 36

Стандартная библиотека Стандартную библиотеку С++ можно разделить на 2 части: n функции, макросы, типы, Стандартная библиотека Стандартную библиотеку С++ можно разделить на 2 части: n функции, макросы, типы, константы, унаследованные от С; n классы и шаблоны от С++. 1

Классы стандартной библиотеки: Потоковые классы Строковый класс Контейнерные классы Алгоритмы Итераторы Математические классы Диагностические Классы стандартной библиотеки: Потоковые классы Строковый класс Контейнерные классы Алгоритмы Итераторы Математические классы Диагностические классы Остальные классы STL 2

n n Потоковые классы предназначены для управления потоками данных между оперативной памятью и внешними n n Потоковые классы предназначены для управления потоками данных между оперативной памятью и внешними устройствами. Строковый класс предназначен для удобной и защищённой от ошибок работы с символьными строками; Контейнерные классы реализуют наиболее распространённые структуры для хранения данных (списки, вектора, множества), а также алгоритмы, использующие эти контейнеры; Итераторы предназначены для унифицированного доступа к элементам контейнерных и других классов; 3

Математические классы поддерживают эффективную обработку массивов с плавающей точкой и работу с комплексными числами; Математические классы поддерживают эффективную обработку массивов с плавающей точкой и работу с комплексными числами; n Диагностические классы обеспечивают динамическую идентификацию типов и объектноориентированную обработку ошибок; n Остальные классы обеспечивают динамическое распределение памяти, обработку функциональных объектов и т. д. n 4

Поток это абстрактное понятие, относящееся к любому переносу данных от источника к приёмнику. 5 Поток это абстрактное понятие, относящееся к любому переносу данных от источника к приёмнику. 5

Поток n n n Поток определяется как последовательность байтов и не зависит от конкретного Поток n n n Поток определяется как последовательность байтов и не зависит от конкретного устройства. Обмен с потоком производится, как правило, через буфер. Чтение данных из потока называется извлечением, вывод в поток — помещением, или включением. По направлению обмена потоки можно разделить на входные, выходные и двунаправленные. По виду устройств, с которыми работает поток, можно разделить потоки на стандартные, файловые и строковые 6

Иерархия потоковых классов streambuf ios istream ifstream ofstring stream istring stream ofstream iostream stringstream Иерархия потоковых классов streambuf ios istream ifstream ofstring stream istring stream ofstream iostream stringstream fstream 7

Классы потоков n n n ios — общие для ввода/вывода поля и методы Streambuf Классы потоков n n n ios — общие для ввода/вывода поля и методы Streambuf - буферизация потоков и их взаимодействие с физич. устройствами istream — входные потоки ostream — выходные потоки iostream — двунаправленные потоки istringstream — входные строковые ostringrstream — выходные строковые stringstream — двунаправленные строковые ifstream — входные файловые ofstream — выходные файловые fstream — двунаправленные файловые 8

Заголовочные файлы n n n n <ios> - базовый класс потоков в/в <istream> - Заголовочные файлы n n n n - базовый класс потоков в/в - шаблон потока ввода - шаблон потока вывода - стандартные объекты и операции с потоками в/в - потоки в/в в файлы - потоки в/в в строки - буферизация потоков в/в - манипуляторы 9

Преимущества и недостатки потоков n n Основным преимуществом потоков по сравнению с функциями ввода/вывода, Преимущества и недостатки потоков n n Основным преимуществом потоков по сравнению с функциями ввода/вывода, унаследованными из библиотеки С, является контроль типов, а также расширяемость; потоки могут работать с расширенным набором символов wchar_t. К недостаткам потоков можно отнести снижение быстродействия программы 10

Стандартные потоки Объект n cin n cout n cerr n clog Класс istream ostream Стандартные потоки Объект n cin n cout n cerr n clog Класс istream ostream операции извлечения из потока >> и помещения в поток << определены путем перегрузки операций сдвига << и >>. 11

Операции << и >> в качестве результата выполнения формируют ссылку на объект типа istream Операции << и >> в качестве результата выполнения формируют ссылку на объект типа istream для извлечения и на объект ostream для чтения. Это позволяет формировать цепочки операций. 12

Операции << и >> n n Числовые значения можно вводить в десятичной или шестнадцатеричной Операции << и >> n n Числовые значения можно вводить в десятичной или шестнадцатеричной системе счисления (с префиксом 0 x) со знаком или без знака. Вещественные числа представляются в форме с фиксированной точкой или с порядком. При вводе строк извлечение происходит до ближайшего пробела Значения указателей выводятся в шестнадцатеричной системе счисления. Под любую величину при выводе отводится столько позиций, сколько требуется для ее представления. 13

Форматирование данных В потоковых классах форматирование выполняется с помощью q флагов q манипуляторов q Форматирование данных В потоковых классах форматирование выполняется с помощью q флагов q манипуляторов q форматирующих методов. 14

Флаги - отдельные биты, объединённые в поле x_flags класса ios. Флаг Положение Действие skipws Флаги - отдельные биты, объединённые в поле x_flags класса ios. Флаг Положение Действие skipws 0 x 0001 Пробельные символы игнорируются при вводе hex 0 x 0040 Шестнадцатеричная СС showbase 0 x 0080 Выводится основание СС uppercase 0 x 0200 При выводе использовать символы верхнего регистра fixed Вывод веществ. чисел в форме с фиксир. точкой 0 x 1000 15

Форматирующие методыэто методы для управления флагами: - setf() – устанавливает флаги; - unsetf() - Форматирующие методыэто методы для управления флагами: - setf() – устанавливает флаги; - unsetf() - сбрасывает флаги; - width() – устанавливает ширину поля вывода в соответствии со значением параметра; - fill () – устанавливает значение текущего символа заполнения. 16

Использование флагов и форматирующих методов #include <iostream> int main(){ long a = 1000, b Использование флагов и форматирующих методов #include 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; } 0 X 3 E 8 0 X 3 F 0. 12 0. 00013 17

Манипуляторы - это функции, которые можно включать в цепочку операций помещения и извлечения для Манипуляторы - это функции, которые можно включать в цепочку операций помещения и извлечения для форматирования данных. 18

Примеры манипуляторов hex – устанавливает флаг восьмеричной СС; oct - устанавливает флаг шестнадцатеричной СС; Примеры манипуляторов hex – устанавливает флаг восьмеричной СС; oct - устанавливает флаг шестнадцатеричной СС; setfill – устанавливает символзаполнитель; setprecision – максимальное кол-во цифр в дробной части; setiosflags – устанавливает флаги состояния потока; setw – устанавливает максимальную ширину поля вывода. 19

Использование манипуляторов #include <iostream> #include <iomanip> int main(){ double d[] = {1. 234, -12. Использование манипуляторов #include #include 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 20

Методы обмена с потоками Программа считывает строки из входного потока в символьный массив. #include Методы обмена с потоками Программа считывает строки из входного потока в символьный массив. #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

Пример Программа считывает либо строки, либо целые числа из файла char str[80], *p; ifstream Пример Программа считывает либо строки, либо целые числа из файла 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 = ''; cout << "Number: " << atoi(str); } else if(isalpha(ch)){ while(isalpha(*p = in. get())) p++; in. putback(*p); *p = ''; cout << "String: " << str; } else in. get(); cout << endl; } while(!in. eof()); 22

peek – возвращает следующий символ без удаления его из потока или EOF (если достигнут peek – возвращает следующий символ без удаления его из потока или EOF (если достигнут конец файла); n putback(с) – помещает в поток символ c, который становится текущим при извлечении из потока n 23

Ввод целого числа int Get. Int(istream& in) { int value; while (true) { in Ввод целого числа int Get. Int(istream& in) { int value; while (true) { in >> value; if (in. peek() == 'n') { in. get(); break; } else { cout << "Повторите ввод (ожидается целое число): " << endl; in. clear(); while (in. get() != 'n') {}; } } return value; } 24

Ошибки потоков В базовом классе ios определено поле state, которое представляет собой состояние потока Ошибки потоков В базовом классе ios определено поле state, которое представляет собой состояние потока в виде совокупности битов: enum io_state{ goodbit = 0 x 00, //нет ошибок eofbit = 0 x 01, //конец файла failbit = 0 x 02, //ошибка форматирования badbit = 0 x 04, //Серьёзная ошибкапользоваться потоком нельзя hardfail =0 x 08}; //неисправность оборудования 25

Методы по управлению состоянием потока int rdstate() – возвращает текущее состояние потока; void clear(int=0) Методы по управлению состоянием потока int rdstate() – возвращает текущее состояние потока; void clear(int=0) – установить состояние потока (по умолчанию 0); int fail()- возвращает ненулевое значение, если есть ошибка потока; int eof()- возвращает ненулевое значение, если установлен флаг eofbit И т. д. 26

Примеры // Проверить, установлен ли флаг flag: if(stream_obj. rdstate() & ios: : flag) // Примеры // Проверить, установлен ли флаг flag: if(stream_obj. rdstate() & ios: : flag) // Сбросить флаг flag: stream_obj. clear(rdstate() & ~ios: : flag) // Установить флаг flag: stream_obj. clear(rdstate() | ios: : flag) // Установить флаг flag и сбросить все остальные: stream_obj. clear( ios: : flag) // Сбросить все флаги: stream_obj. clear() 27

Примеры void Check. Status(ifstream &in){ int i; i = in. rdstate(); if(i & ios: Примеры void Check. Status(ifstream &in){ int i; i = in. rdstate(); if(i & ios: : eofbit) cout << "EOF is occured" << endl; else if(i & ios: : failbit) cout << "Not fatal i/o error" << endl; else if(i & ios: : badbit) cout << "Fatal i/o error « << endl; } 28

Файловые потоки Т. к. классы ifstream, ofstream, fstream – производные от классов istream, ostream, Файловые потоки Т. к. классы ifstream, ofstream, fstream – производные от классов istream, ostream, iostream, то наследуются <<, >>, флаги форматирования, манипуляторы, методы и т. д. Использование файлов в программе предполагает: n создание потока; n открытие потока и связывание его с файлом; n обмен (ввод/вывод); n закрытие файла. Каждый класс файловых потоков содержит конструкторы, с помощью которых можно создавать объекты этих классов различными способами. 29

Конструкторы n Конструкторы без параметров создают объект соответствующего класса, не связывая его с файлом: Конструкторы n Конструкторы без параметров создают объект соответствующего класса, не связывая его с файлом: n n ifstream(); ofstream(); Конструкторы c параметрами создают объект соответствующего класса, открывают файл с указанным именем и связывают файл с объектом: n n n ifstream(const char *name, int mode = ios: : in); ofstream(const char *name, int mode = ios: : out | ios: : trunc); fstream(const char *name, int mode = ios: : in | ios: : out); 30

Режимы открытия файла in – для чтения; out – для записи; app – открыть Режимы открытия файла in – для чтения; out – для записи; app – открыть для добавления в конец; trunc – удалить существующий файл; nocreate – выдать ошибку, если файл не существует; noreplace – выдать ошибку, если файл существует; binary – открыть в двоичном режиме. 31

Открытие файла Открыть файл в программе можно с использованием: n конструкторов; n метода open, Открытие файла Открыть файл в программе можно с использованием: n конструкторов; n метода open, имеющего такие же параметры, как и в соответствующем конструкторе: ifstream inpf ("input. txt“, ios: : in | ios: : nocreate); if (!inpf){ cout << "Невозможно открыть файл для чтения"; return 1; } ofstream f; f. open("output. txt", ios: : out); if (!f){ cout << "Невозможно открыть файл для записи"; return 1; } 32

Пример (программа выводит на экран содержимое файла): #include <fstream> int main(){ char text[81], buf[81]; Пример (программа выводит на экран содержимое файла): #include int main(){ char text[81], buf[81]; cout << "Введите имя файла: "; cin >> text; ifstream f(text, ios: : in | ios: : nocreate); if (!f){ cout << "Ошибка открытия файла"; return 1; } while (!f. eof()){ f. getline(buf, 81); cout << buf << endl; } return 0; } 33

Закрытие файлового потока Для закрытия файлового потока определён метод close(), который автоматически выполняется деструктором. Закрытие файлового потока Для закрытия файлового потока определён метод close(), который автоматически выполняется деструктором. Поэтому явный вызов close() необходим только тогда, когда требуется закрыть поток раньше конца его области видимости. 34

Строковые потоки n 1. 2. 3. n n n Строковые потоки позволяют считывать и Строковые потоки n 1. 2. 3. n n n Строковые потоки позволяют считывать и записывать информацию из областей оперативной памяти так же, как из файла, с консоли или на дисплей. 3 класса строковых потоков: istringstream – входные ostringstream - выходные stringstream – двунаправленные. Эти классы определяются в заголовочном файле Участки памяти, с которыми выполняются операции чтения и извлечения, по стандарту определяются как строки С++ (класс string). Строковые потоки являются некоторым аналогом функций sscanf и sprintf и могут применяться для преобразования данных, а также для обмена информацией между модулями программы. 35

Потоки и типы, определенные пользователем Перегрузка операций чтения << и извлечения >> на тип Потоки и типы, определенные пользователем Перегрузка операций чтения << и извлечения >> на тип данных пользователя: class My. Class { int x; float y; // Вывод: friend ostream& operator << (ostream& out, My. Class& C){ return out << “x = “ << C. x << “ y = “ << C. y; } // Ввод: friend istream& operator >> (istream& in, My. Class& C){ cout << “Введите х: “; in >> C. x; cout << “Введите y: “; in >> C. y; return in; } }; 36