14.Ввод-вывод-new.pptx
- Количество слайдов: 38
14. Потоковый ввод/вывод
14. 1. Общая характеристика Формат состояния ios: ios_base независимый от национальных особенностей basic_ios<> зависящий от национальных особенностей указатели basic_streambuf<> буферизация указатель locale информация о формате Классы потокового ввода/вывода: basic_iostream<> 2
14. 1. Общая характеристика (продолжение) typedef basic_ostream<char> ostream typedef basic_ostream<wchar> wostream cout, cerr, clog; wostream wcout, wcerr, wclog; typedef basic_istream<char> istream typedef basic_istream<wchar> wistream cin; wistream wcin; 3
14. 2. Иерархия классов ios_base ios<> istream<> istringstream<> ifstream<> ostream<> iostream<> fstream<> ostringstream<> 4
14. 3. Базовый класс ios Контролирует: • форматирование • национальные особенности • обращение к буферам Определяет некоторые типы (typedef) и константы 5
14. 4. Состояние формата Флаги формата: • система счисления – dec, hex, oct, showbase, basefield • способ вывода вещественных чисел – scientific, fixed, floatfield • выравнивание поля – left, right, internal, adjustfield. . . 6
14. 4. Состояние формата (продолжение) Чтение флагов состояния: fmtflags () const; Установка флагов: fmtflags (fmtflags f); Добавление флагов: fmtflags setf(fmtflags f , fmtflags mask ) Сброс флагов: void unsetf(fmtflags mask); 7
14. 4. Состояние формата (продолжение) Объединение флагов: ios_base: : left | ios_base: : oct Точность представления чисел с плавающей запятой: streamsize precision () const; streamsize precision (streamsize n); // до следующего вызова функции 8
14. 4. Состояние формата (продолжение) Поля вывода: streamsize width () const; streamsize width (streamsize n); // минимальная длина поля; влияет только на // следующую за ней операцию ввода/вывода Заполнение поля: char fill () const; char fill (char ); 9
14. 5. Манипуляторы #include <iostream> #include <iomanip> using namespace std; Функции – не члены класса или статическая функция – член класса: ostream & f (ostream &); istream & f (istream &); ios_base & f (ios_base &); 10
14. 5. Манипуляторы (продолжение) ostream & operator << (тип & (*f)(тип &)) { return f (*this); } тип: ostream, ios_base istream & operator >> (тип & (*f)(тип &)); тип: istream, ios_base Примеры: endl(cout); cout << … << endl; cout << oct << x << “, “ << dec << y << flush; 11
14. 5. Манипуляторы (продолжение) Манипуляторы с аргументами cout << setprecision(4) << x << endl; Объект-функция, вызываемая оператором <<, а не () 12
14. 5. Манипуляторы (продолжение) struct smanip { // функция для вызова ios_base & (*f) (ios_base &, int); int i; smanip(ios_base & (*fp) (ios_base &, int), int k) : f (fp), i (k) { } }; 13
14. 5. Манипуляторы (продолжение) // функция – помощник ios_base& set_precision (ios_base &s, int k) { return s. setprecision (k); } inline smanip setprecision ( int k) { return smanip(set_precision, k); } 14
14. 5. Манипуляторы (продолжение) ostream & operator << (ostream & os, smanip & m) { return m. f(os, m. i); } Использование: cout << setprecision(4) << x << endl; 15
14. 5. Манипуляторы (продолжение) cout << setprecision(4) <<. . . 1. Вызов функции smanip setprecision(int k) { return smanip(set_precision, k); } 3. Перегруженный оператор m smanip: f i 4 2. Создание объекта stream& operator << ( ostream &os, smanip &m) { return m. f(os, m. i); } ios_base set_precision ( ios_base &s, int k) { return s. setprecision (k); } 16
14. 5. Манипуляторы (продолжение) smanip setfill (int c); // с – символ заполнения smanip setprecision (int n); // n цифр после точки smanip setw (int n); // n – ширина поля smanip setbase (int b); // b – основание системы счисления 17
14. 6. Потоковый ввод/вывод #include <iostream> using namespace std; Вывод встроенных типов: класс ostream& operator<<(тип); ostream& put(char); ostream& write(const char *, streamsize); streamsize – интегральный со знаком тип для представления числа символов 18
14. 6. Потоковый ввод/вывод (продолжение) Ввод встроенных типов: класс istream& operator >>(тип&); int get(); istream& get(char&); istream& get(char*, streamsize , char term ); // не удаляет term из потока istream& getline(char*, streamsize , char term ); // удаляет term из потока – нуль ограниченные строки 19
14. 6. Потоковый ввод/вывод (продолжение) istream& read(char* s, streamsize n); – точно n символов (ошибка – failbit и eofbit, если в процессе чтения обнаружен конец файла); строка не нуль ограниченная streamsize gcount() const; – количество символов, считанных из потока 20
14. 6. Потоковый ввод/вывод (продолжение) istream& readsome(char* s, streamsize n); До n символов; failbit и eofbit не устанавливаются, если обнаружен конец файла; строка не нуль ограниченная 21
14. 6. Потоковый ввод/вывод (продолжение) istream& ignore (streamsize n = 1, int t = EOF ); // EOF – маркер конца файла #include <limits> std: : numeric_limits<std: : streamsize>: : max() Игнорирование остатка строки: cin. ignore(numeric_limits<std: : streamsize>: : max(), ‘n’); 22
14. 7. Состояние потока bool good() const, eof() const, fail() const, bad() const; Флаги состояний: ios_base: : badbit eofbit failbit goodbit // ok // конец файла // устранимая ошибка // поток испорчен // или ios: : … // goodbit == 0 23
14. 7. Состояние потока (продолжение) iostate rdstate() const; void clear(iostate f = goodbit); void setstate(iostate f); // добавить f operator void* () const; // не нуль, если !fail() bool operator ! () const; // не good() ios_base: : iostate s = cin. rdstate(); if(s & ios_base: : badbit) … 24
14. 8. Файловые потоки Имя файла Начало файла 0 1 2 учз . . . Конец файла n-1 Размер файла 25
14. 8. Файловые потоки (продолжение) Открытие файла • конструкторы • метод open() Чтение из файла / запись в файл • методы, унаследованные от istream и ostream Закрытие файла • десруктор • метод close(): переменная. close(); 26
14. 9. Открытие файла Имя файла: нуль ограниченная строка Операции с файлом – режимы (mode): • ios_base: : in – для чтения из файла • ios_base: : out – для записи в файл • ios_base: : app – для добавления в конец файла 27
14. 9. Открытие файла (продолжение) Дополнительные возможности: • ios_base: : ate – позиционирование в конец файла • ios_base: : binary – ввод/вывод в двоичном (а не в текстовом) виде • ios_base: : trunc – усечение файла до нулевой длины 28
14. 9. Открытие файла (продолжение) Конструкторы: класс переменная ( имя_файла , режим ); Метод open(): переменная. open (имя_файла , режим ); Объединение режимов: ios_base: : in | ios_base: : out | ios_base: : binary 29
14. 9. Открытие файла (продолжение) • Класс ifstream – по умолчанию открывается на чтение • Класс ofstream – по умолчанию открывается на запись с усечением длины файла до нуля • Класс fstream – по умолчанию открывается на чтение и запись 30
14. 9. Открытие файла (продолжение) Проверка успешности открытия: operator !() Пример: ifstream f(“src. txt”); if ( ! f ) { cerr << “cannot open filen“; return 1; } 31
14. 9. Открытие файла (продолжение) Пример: 32
14. 10. Буферизация Получение текущей позиции: pos_type tellp(); pos_type tellg(); Установка текущей позиции: ostream & seekp(смещение, позиция); istream & seekg(смещение, позиция); 33
14. 10. Буферизация (продолжение) Позиция: ios_base: : beg – начало текущего файла ios_base: : cur – текущая позиция файла ios_base: : end – конец текущего файла beg 0 1 2 cur . . . end n-1 n 34
14. 10. Буферизация (продолжение) Определить размер файла: ifstream from("iostr. cpp"); from. seekg(0, ios: : end); int k = from. tellg(); cout << "file size is " << k << endl; 35
14. 10. Буферизация (продолжение) ostream & flush(); – выталкивание буфера istream & putback(char c); – положить с обратно в буфер istream &unget(); – положить обратно в буфер последний прочитанный символ int peek(); – посмотреть следующий символ в буфере, не считывая его 36
14. 11. Строковые потоки #include <sstream> Класс istringstream – чтение из строки Класс ostringstream – запись в строку Класс stringstream – чтение/запись string str() const; – получить копию строки void str(const string &); – установить строку 37
14. 11. Строковые потоки (продолжение) Пример: подготовка форматированного вывода. . . ostingstream out; out <<. . . ; return out. str(); Примеры: 38
14.Ввод-вывод-new.pptx