
- •3.1.1. Функции посимвольного ввода-вывода
- •3.1.1.1.Функции посимвольного ввода
- •Функции посимвольного стандартного ввода Функция getchar
- •Функция fgetchar
- •Функция ungetch
- •Функция getch
- •Функция getche
- •Функции посимвольного потокового ввода Функция fgetc
- •Функция getc
- •Функция ungetc
- •3.1.1.2. Функции посимвольного вывода
- •Функции стандартного вывода Функция putchar
- •3.1.2.Форматированный ввод-вывод
- •3.1.2.1.Форматированный ввод Функция scanf
- •Функция cscanf
- •Управляющая строка функций ввода
- •Модификатор
- •Символы преобразования и их смысл Тип переменной int
- •Тип переменной char
- •Тип переменной char*
- •Тип переменной float
- •3.1.2.2.Форматированный вывод Функция printf
- •Функция cprintf
- •Отдельные поля спецификации преобразования Флаги
- •Точность
- •Модификатор
- •Символы преобразования и их смысл Тип переменной int
- •Тип переменной char
- •Тип переменной char*
- •Тип переменной float
- •3.1.3. Функции построчного ввода-вывод
- •3.1.3.1.Функции построчного ввода Функция cgets
- •3.1.3.2.Функции построчного вывода Функция cputs
- •Лекция №2(продолжение)
- •4.1. Библиотека iostream
- •Буферизованные потоки (класс streambuf )
- •Потоковый класс ios
- •4.2.2. Потоковый ввод
- •4.3. Форматирование потокового ввода-вывода
- •4.3.1. Форматирующие функции-элементы
- •4.3.2. Флаги форматирования
4.3.2. Флаги форматирования
Форматирование ввода и вывода определяется различными флагами состояний формата, перечисленными в классе ios. Эти состояния определяются битами числа типа long int (см. таблицу) Эти флаги читаются функцией-элементом flags, устанавливаются функцией setf() и сбрасываются функцией unsetf(). Есть два варианта функции setf():
long ios::setf(long);
long ios::setf(long, long);
Первым аргументом является набор флагов, объединенных операцией побитового ИЛИ(|) (см. таблицу). Вторым аргументом является специальная битовая маска, определяющая, какую группу флагов можно модифицировать(изменять):
Для чтения и установки текущих флагов потока используется функция:
long ios::flags();
long ios::flags(long);
В первом случае функция возвращает текущие флаги потока, а во втором – присваивает флагам значение, сообщаемое параметром, и возвращает прежнее значение флагов.
adjustfield = internal | left | right
basefield = dec | oct | hex
floatfield = fixed | scientific
Пропуск пробельных символов управляется флагом ios::skipws в перечислимой переменной состояния. Флаг skipws обычно устанавливает пропуск пробельных символов. Очистка этого флага (например, при помощи setf) выключает пропуск пробельных символов. Отметим также специальный манипулятор "приемника", ws, который позволяет игнорировать пробельные символы.
Таблица Флаги форматирования
Флаг |
Бит числа |
Назначение |
skipws |
0x0001 |
пропуск пробельного символа на вводе |
left |
0x0002 |
вывод с левым выравниванием |
right |
0x0004 |
вывод с правым выравниванием |
internal
|
0x0008
|
заполнитель после знака или указателя системы счисления (знак числа выводится с левого края, а число – с правого, остальное заполняется символами fill) |
dec |
0x0010 |
десятичное преобразование |
oct |
0x0020 |
восьмеричное преобразование |
hex |
0x0040 |
шестнадцатеричное преобразование |
showbase |
0x0080 |
показать на выходе указатель системы счисления |
showpoint |
0x0100 |
показать позицию десятичной точки(на выходе) |
uppercase
|
0x0200
|
вывод шестнадцатеричных значений буквами верхнего регистра (экспонента также Е) |
showpos |
0x0400 |
показать знак "+" для положительных чисел |
scientific
|
0x0800
|
использовать запись чисел с плавающей точкой с выводом экспоненты Е например, 12345E2 |
fixed |
0x1000 |
использовать запись чисел с плавающей точкой типа 123.45 |
unitbuf |
0x2000 |
буфер потока опорожняется после каждой операции помещения |
stdio |
0x4000 |
потоки stdout и stderr опорожняются после каждой операции помещения |
Пример: Вывести на экран таблицу квадратов и квадратных корней чисел от 1 до 5.
#include <iostream.h>
#include <math.h>
main()
{ double n=1.0,kv,kvk ;
cout<<" число\tквадрат\t\tкорень квадратный\n";
cout<<"_________________________________________\n";
cout.setf(ios::fixed); //фиксированный формат(без экспоненты)
for(int i=0;i<=5;i++)
{
kv=n*n;
kvk=sqrt(n);
cout.fill('0'); cout.width(2);
cout. precision(0); //0 цифр после запятой
cout<<n<<'\t';
cout.fill(' '); cout<<kv<<"\t\t";
cout. precision(6); cout<<kvk<<'\n';
n++;
}
}
Результат:
число квадрат корень квадратный
_____________________________________
01 1 1.000000
02 4 1.414214
03 9 1.732051
04 16 2.000000
05 25 2.236068
4.3.3. Манипуляторы
Простой способ изменения некоторых форматных переменных состоит в использовании специальной функциональной операции, которая называется манипулятором.
Таблица. Простые манипуляторы потока
Манипулятор |
Действие |
dec |
Установка флага форматирования с десятичными преобразованиями. |
hex |
Установка флага форматирования с шестнадцатиричными преобразованиями. |
oct |
Установка флага форматирования с восьмиричными преобразованиями. |
ws |
Извлечение пробельных символов. |
endl |
Вставка символа новой строки и очистка потока. |
ends |
Вставка конечного пустого символа в строку. |
flush |
Сброс на диск и очистка ostream |
Для работы с параметризованными манипуляторами надо дополнительно подключать файл iomanip.h .
Таблица. Параметризованные манипуляторы потока
setbase(int n) |
Установка системы счисления при преобразованиях с основанием n (0, 8, 10 или 16). Нуль означает по умолчанию десятичную систему при выводе и правила С для литералов целых чисел при вводе. |
resetiosflags(long f) |
Очистка форматных бит в ins или outs, заданных аргументом f. |
setiosflags(long f) |
Установка бит форматирования в ins или outs, заданных аргументом f. |
setfill(int c) |
Установка символа-заполнителя в c. |
setprecision(int n) |
Установка точности представления чисел с плавающей точкой равной n разрядам |
setw(int n) |
Установка ширины поля в значение n |
Манипуляторы воспринимают в качестве аргументов ссылку на поток и возвращают ссылку на тот же поток, поэтому манипуляторы могут объединяться в цепочку занесений в поток (или извлечений из потока) для того, чтобы изменять состояния потока в виде побочного эффекта, без фактического выполнения каких-либо занесений (или извлечений).