Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КПИЯП_ОТВЕТЫ_3 ред.docx
Скачиваний:
0
Добавлен:
16.12.2019
Размер:
46.21 Кб
Скачать

3.01

Система ввода - вывода С++

Предназначена для поддержки консоли и файлов.

С++ поддерживает две системы ввода-вывода:

  • С- систему для совместимости со старыми программами

  • объектно ориентированную систему ввода-вывода

Особенности ( системы объектно ориентированного ввода-вывода ):

  • соответствие принципам ООП ( средства работы с объектами )

  • дополнительные расширения

Библиотеки ОО ввода-вывода:

  • <iostream.h> - старая библиотека, разработанная для исходной спецификации С++

  • <iostream> - новая система ввода-вывода

Поток.

Поток - логическое устройство, получающее или передающее информацию.

Особенности:

  • поток связан с физическим устройством ввода - вывода

  • все потоки функционируют одинаково, хотя физические устройства, связанные с ними, могут быть различными

  • одна функция ввода-вывода может работать с разными типами физических устройств

Класс потоков.

В основе системы ввода-вывода лежат две иерархии шаблонных классов:

  • первая предназначена для поддержки низкоуровневого ввода-вывода ( в ее основе лежит класс basic_streambuf )

  • вторая предназначена для поддержки высокоуровневых операций ввода-вывода, проверки ошибок и анализа информации о статусе потоков ( в основе лежит класс basic_ios )

Иерархия класса потоков bacis_ios.

  • ios_base - определяет ряж базовых свойств

\/

basic_ios - высокоуровневый ввод-вывод

\/

basic_istream - поток ввода

\/ \/

\/ basic_ifstream - файловый поток ввода

\/

basic_ostream - поток вывода

\/ \/

\/ basic_ofstream - файловый поток вывода

\/

basic_iostream - поток ввода-вывода

\/

basic_fstream -файловый поток ввода-вывода

Специализация классов потоков.

В стандарте С++ создаются две специализации шаблонных классов:

  • char - для поддержки 8-битовых символов ( шаблонные классы streambuf, ios, istream, ostream, iostream )

  • wchar_t - для поддержки расширенных символов ( шаблонные классы wstreambuf, wios, wistream, wostream, wiostream )

Класс ios ( wios ) содержит большое число функций-членов и переменных, управляющих операциями над потоками.

Встроенные потоки.

  • cin ( win ) - стандартный ввод

  • cout ( wout ) - стандартный вывод

  • cerr ( werr ) - стандартный вывод ошибок

  • clog ( wlog ) - буферизированный вариант потока вывода ошибок cerr ( werr )

Эти потоки открываются при старте программы.

3.02

Форматированный ввод-вывод ( с использованием флагов форматирования ).

Операции форматирования при вводе-выводе позволяют задать визуальное представление объекта .

Способы форматирования:

  • путем обращения к членам класса ios

  • с использованием манипуляторов

Поток имеет набор флагов формата, которые управляют представлением информации.

Для ios ( реально в ios_base ) объявлена битовая маска fmtflags:

typedef T1 fmtflags;

static const fmtflags boolalpha, dec, fixes, hex, internal, left, oct, right, scientific, showbase, showpoint, showpos, skipws, unitbuf, uppercase, adjustfield, basefield, floatfield;

Описание флагов:

  • adjustfield ( left, right, internal ) - выравнивание по левому краю . по правому, по полю вывода

  • basefield ( oct, dec, hex ) - флаги основания системы счисления

  • boolalpha - флаг разрешения ввода булевых значений

  • floatfield ( scientific, fixed ) - формат вывода числа

  • showbase - флаг вывода основания системы счисления

  • showpos - вывод знака положительных чисел

  • showpoint - вывод точки и незначащих нулей

  • skipws - игнорирование разделительных симовлов при вводе данных из потока

  • uppercase - флаг вывода букв формата в заглавном виде ( 1.0Е5, 0X1F)

  • unifbuf - флаг очистки буфера после каждой операции вставки

Установка файлов формата.

Для установки используется функция:

fmtflags setf ( ftmflags флаги );

Особенности:

  • возвращает текущее состояние флагов формата ( до установки )

  • флаги - перечень существующих флагов для установки ( например ios_base::showpos)

  • при установке нескольких флагов используется операцию побитового ИЛИ "|"

  • применяется к конкретному потоку ( метод потока )

Сброс флагов формата.

Void unsetf( fmtflags флаги );

Особенности:

  • флаги - перечень существующих флагов для сброса, все сотальные сохряняют свое состояние

  • при сбросе нескольких флагов используется операция побитового ИЛИ

  • применяется к конкретному потоку

Перегруженная форма функции setf ().

fmtflags setf( fmtflags флаги1, fmtflags флаги2);

Особенности:

  • возвращает текущее состояние флагов формата ( до операции )

  • флаги 1 - перечень флагов для установки ( но будут установлены только такие флаги1, которые перечислены в списке флаги2)

  • флаги 2 - список флагов для сброса

Проверка флагов формата.

Для получения текущего состояния флагов формата без их установки- снятия используется функция

fmtflags flags();

Особенности:

применяется к конкретному потоку.

Установка всех флагов формата:

fmtflags flags ( fmtflags f);

Особенности:

  • возвращает текущее состояние флагов формата ( до операции )

  • f - битовый шаблон флагов формата

Функция width ()

Позволяет изменять ширину поля вывода.

streamsize width ( streamsize w );

Особенности:

  • ф-ция возвращает предыдущую ширину

  • w - новое значение ширины

  • если данные не циликом заполняют поле, то они дополняются символом заполнителем

  • если число не вмещается в поле, то выводится без усечения

3.03

Применение манипуляторов формата.

Манипуляторы- специальные функции, которые включаются в операторы ввода-вывода.

Особенности:

  • для доступа к манипуляторам необходимо подключить библиотеку < iomanip >

  • если манипулятор не имеет аргументо, то скобки после него не ставятся ( фактически выполняется не вызов функции, а передача адреса оператору ввода-вывода)

Стандартные манипуляторы:

  • hex, dec, oct

  • fixed, scientific

  • left, right, internal

  • boolalpha, noboolalpha

  • showbase, noshowbase

  • showpoint, noshowpoint

  • skipws, noskipws

  • uppercase, nouppercase

  • unitbuf, nounitbuf

  • setiosflags( fmtflags f ), resetiosflags( fmtflags f )

  • setbase ( int base )

  • setfill ( char c )

  • setprecision ( int p )

  • setw ( int w )

  • endl

  • ends

  • flush

  • ws

Пример использования стандартных манипуляторов:

#include <iostream>

using namespace std;

3.04

Создание манипуляторов.

Разрешено создание собственных манипуляторов.

Особенности:

  • различают манипуляторы ввода и вывода

  • обычно создают манипуляторы без параметров

  • возможность создания манипулятора с параметрами зависит от компилятора

  • позволяют собрать несколько операций ввода-вывода в одном месте

  • можно использовать для работы с перифирийными физ. устройствами через потоки ( например передача специальных команд принтеру )

Iostream& manip_name (iostream& stream){

// ...

return stream;

}

Особенности:

  • получает ссылку на поток ( при использовании этот аргумент не указывается )

  • возвращает ссылку на поток

  • создается для выполнения часто используемых операций

ostream& nr( ostream& stream){

stream << " **** " << endl;

return stream;

}

3.05

Перегрузка операторов вводы и вывода из потока.

Особенности:

  • оператор << - оператор вставки в поток

  • оператор >> - оператор извлечения

  • желательно чтобы полученные операторы были универсальными и работали сразными потоками

Перегрузка оператора >>

istream& operator<< ( istream& stream, class_name& obj);

Особенности:

  • не может быть членом класса

  • stream - ссфлка на поток ввода

  • obj - ссылка на объект пользовательского типа

  • возвращает ссылку на поток ввода для выполнения цепочек

  • для доступа к закрытым членам класса следует определять функцию как дружественную классу ( friend )

3.06

Пергрузка оператора <<

ostream& operator << (ostream& stream, class_name obj);

Особенности:

  • не может быть членом класса

  • stream - ссылка на поток ввода

  • obj - объект пользовательского типа

  • возвращает ссылку на поток для выполнения цепочек

  • для доступа к закрытым членам класса определять оператор как friend

3.07

Файловая система.

Предназначена для поддержки файлов.

Особенности:

  • файловая система - часть общей объекто-ориентированной системы ввода-вывода

  • соответствие принципам объектно-ориентированного программирования

  • дополнена особенностями поддержки файлов

Файлы.

Файл - физ. устройство с которым осуществляется всязь по обмуну данными.

Работа с файлами ведется с использованием потоков - абстрактное ( логическое ) устройство.

Файловый поток одновременно может быть связан только с одним файлом.

Все потоки в файловой системе одинаковы, а сами файлы мгут отличаться.

Принципы работы с файлом.

Чтобы работать с файлом вначале необходимо свящать его с некоторым потоком.

  • сначала задаем экземпляр файлового потока одного из типов ifstream, ofstream, fstream

  • для связи уже имеющегося потока и файла необходимо выполнить открытие файла

  • по окончанию оапботы с файлом необходимо разорвать связь с потоком, чтобы не осталось зависших данных, для этого используется закрытие файла.

Статус состояния ввыода - вывода.

Поток имеет набор флагов статуса состояния.

Для ios объявлена битовая маска iostate:

typedef T2 iostate;

static const iostate badbit, eofbit, failbit, goodbit;

  • goodbit - нормальное состояние ( не битовая маска )

  • eofbit - обнаружен конец файла

  • failbit - обнаружена исправимая ошибка

  • badbit - обнаружена критическая ошибка

Получение информации о статусе ввода-вывода

Первый сопсоб получения информации о статусе связан с функцией:

iostate rdstate();

Особенности:

  • Если ошибок не обнаружено, то возвращается значение goodbit;

  • При возникновении ошибок требуетсяя анализ битовых флагов ошибок:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]