Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций -=Вычислительная техника и прог...docx
Скачиваний:
11
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

Потоковые объекты ввода/вывода (форматируемые):

сin  —  связывается с клавиатурой (входные потоки с буфером);

сout  — связывается с экраном (выходные потоки с буфером);

cerr  — связывается с экраном для вывода сообщений об ошибках (выходные потоки без буфера);

clog  — связывается с экраном для вывода сообщений об ошибках (выходные потоки с буфером).

Функции (методы) ввода/вывода (неформатируемые):

get ()  — возвращает считанный из потока код символа или код ошибки 0x E0F;

get (ch)  — возвращает ссылку на поток, из которого выполнялось чтение, и записывает извлеченный символ в ‘ch’.

put (ch)  — выводит в поток символ ‘ch’ и возвращает ссылку на поток.

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

— с помощью флагов;

— с помощью манипуляторов;

— с помощью форматирующих методов.

Флаги — отдельные биты, объединённые в поле x_flays типа long класса ios.

6.1.2.1 Форматирование данных с помощью флагов и методов

Поля класса ios, используемые при форматировании:

int x_flags — отдельные биты форматирования, объединенные в поле типа long;

int x_width — минимальная ширина поля вывода;

int x_precision — кол-во цифр в дробной части при выводе вещественных чисел с фиксированной точкой или общее ко-во значащих цифр при выводе в форме с мантиссой и порядком;

int x_fill — символ заполнения поля вывода.

Флаги форматирования данных в потоковых классах представлены в таблице 6.1.

Таблица 6.1 — Флаги форматирования данных в потоковых классах

Флаг

Положение

Действие при установке бита (флага)

skipws

0x001

При извлечении пробельные символы игнорируются

left

0x002

Выравнивание по левому краю поля

right

0x004

Выравнивание по правому краю поля

internal

0x008

Выводится знак числа по левому краю, число — по правому. Между — символы из x_fill (пробелы по умолчанию)

dec

0x0010

Десятичная система счисления

oct

0x0020

Восьмеричная система счисления

hex

0x0040

Шестнадцатеричная система счисления

showbase

0x0080

Выводится основание системы счисления (0x — для шестнадцатеричных чисел, 0 — для восьмеричных)

showpoint

0x0100

Печатать десятичную точку и дробную часть

uppercase

0x0200

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

showpos

0x0400

Печатать знак при выводе положительных чисел

scientific

0x0800

Печатать вещественные числа в форме мантиссы с порядком

fixed

0x1000

Печатать вещественные числа в форме с фиксированной точкой (точность — из x_precision)

Управление флагами поля x_flags c помощью методов flags, setf и unsetf:

long ios :: flags( )  — возвращает текущие флаги потока;

long ios :: flags(long)  — присваивает флагам значение параметра;

long ios :: setf(long, long)  — присваивает флагам, биты которых установлены в первом параметре, значение битов второго параметра;

long ios :: setf(long)  — устанавливает флаги, биты которых установлены в параметре;

long ios :: unsetf(long)  — сбрасывает флаги, биты которых установлены в параметре.

Примечание:

— все функции (методы) возвращают прежние значения флагов;

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

adjustfiled (left | right | internal) — выравнивание;

basefiled (dec | oct | hex) — система счисления;

floatfiled (scientific | fixed) — представление дробных чисел.

Управление полями x_width, x_precision и x_fill с помощью методов width, precision и fill:

int ios :: width( ) — возвращает значение ширины поля вывода;

int ios :: width(int) — устанавливает ширину поля вывода в соответствии со значением параметра;

int ios :: precision( ) — возвращает значение точности представления при выводе вещественных чисел;

int ios :: precision(int) — устанавливает значение точности представления при выводе вещественных чисел;

char fill( ) — возвращает текущий символ заполнения;

char fill(char) — устанавливает значение текущего символа заполнения.

Пример (форматированный вывод):

…

cout.width(10);

cout.precision(3) , cout.setf(ios :: showpoint) ;

cout.setf(ios :: left , ios :: adjustfield) ;

cout.setf(ios :: fixed , ios :: floatfield) ;

cout<<a ;

…

cout.width(7) ;

cout.setf(ios :: hex | ios :: showbase | ios :: uppercase) ;

cout<<b ;

Пример (неформатированный ввод/вывод):

#include <iostream.h>

void main()

{

int const n=4 ;

int i;

char b[n] ;

for(i=0; i<n; i++)

{ cin.get(b[i]) ; } //<– –b[i]=cin.get();

for(i=n–1; i>=0; i––)

{ cout.put(b[i]) ; }

}

Результат выполнения программы:

Ввод: abcd <ENTER>

На экране: abcd

dcba

6.1.2.2. Форматирование данных с помощью манипуляторов

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

Манипуляторы разделяются на:

— простые (без аргументов);

— параметризированные (требующие указания аргументов).

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

— использование манипуляторов требует подключения библиотечного файла <iomanip.h> ;

— изменение системы счисления действует до следующего явного изменения системы счисления;

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

Рассмотрим простые манипуляторы:

dec — устанавливает при вводе и выводе флаг десятичной системы счисления;

oct — устанавливает при вводе и выводе флаг восьмеричной системы счисления;

hex — устанавливает при вводе и выводе флаг шестнадцатеричной системы счисления;

ws — устанавливает при вводе извлечение пробельных символов;

endl — при выводе включает в поток символ новой строки и выгружает буфер;

ends — при выводе включает в поток нулевой символ;

flush — при выводе выгружает буфер.

Пример:

cout<<13<<hex<<' '<<13<<oct<<' '<<13<<endl;

На экране появится надпись:

13 d 15

Рассмотрим параметризированные манипуляторы <iomanip.h>:

setbase(int n) — задаёт основание системы счисления (n=8, 16, 10 или 0);

resetiosflags(long) — сбрасывает флаги состояния потока;

setiosflags(long) — устанавливает флаги состояния потока;

setfill(int) — устанавливает символ-заполнитель;

setprecision(int) — устанавливает точность вещественных чисел;

setw(int) — устанавливает максимальную ширину поля вывода.

Пример:

//параметризованные манипуляторы:

double d[] = {1.234, -12.34567, 123.456789, -1.234,0.00001};

cout <<setfill(‘.’)<<setprecision(4)

<<setiosflags(ios::showpoint | ios::fixed);

for(int i=0; i<5; i++) cout<<setw(12)<<d[i]<<endl ;

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

......1.2340

..–12.3457

..123.4568

….–1.2340

……0.0000