Форматирование данных при обменах с потоками ввода-вывода
Данные при обмене с потоками ввода-вывода используют стандартный формат внешнего представления. Например, при выводе чисел каждое из них занимает ровно столько позиций, сколько необходимо для его представления: число 1/3 будет выведено на экран в виде 0.333333. Это не всегда удобно. Форматы представления выводимой информации и правила восприятия данных, вводимых из потока, могут быть изменены с помощью флагов форматирования. Эти флаги унаследованы всеми потоками библиотеки из базового класса ios. Перечислим некоторые флаги, объясняя их действие при значениях, принимаемых этими флагами по умолчанию:
left - вывод значения с левым выравниванием;
right – вывод значения с правым выравниванием;
dec – десятичная система счисления;
осt - восьмеричная система счисления;
hex – шестнадцатеричная система счисления;
showbase – напечатать при выводе признак системы счисления (0x - для шестнадцатеричных, 0 – для восьмеричных);
showpoint – при выводе вещественных чисел обязательно печатать точку и следующие за ней нули;
fixed – для вещественных чисел использовать представление в формате с фиксированной точкой.
Для изменения этих флагов используют функцию setf следующим образом: cout.setf (setbits, field) или cout.setf (setbits). Функция устанавливает флаги в соответствии со значением параметров. Биты, помещенные в параметре field, сбрасываются, а затем устанавливаются те биты, которые указаны в параметре setbits.
Кроме флагов для управления форматом используют компонентные переменные класса, значение которых при выводе данных можно изменить с помощью компонентных функций:
cout.width (x), где x- целое число, задающее минимальную ширину поля вывода;
cout.precision (x), где x – целое число, задающее точку представления вещественных чисел, то есть максимальное количество цифр дробной части при выводе;
cout.fill(x), где x определяет символ заполнения поля ввода до минимальной величины, определенной переменной width. По умолчанию fill имеет значение пробела.
Пример 1. Ввести с клавиатуры и вывести на экран два вещественных числа в формате 2 знака поле запятой и заполнить пространство между ними символом # следующим образом:
32.76#############################5.41##############################
#include <iostream.h>
#include <conio.h>
void main()
{
float a,b;
int i;
cout << "\nEnter numbers\n";
cin>>a>>b;
clrscr(); //функция очистки экрана, описана в заголовочном
//файле conio.h
cout.setf(ios::fixed); //вывод вещественных чисел в формате с
//фиксированной точкой
cout.setf(ios::left);//вывод значения с левым выравниванием
cout.width(40); //установили ширину поля вывода 40 символов
//(половина ширины экрана)
cout.precision(2);//установили число знаков после запятой
//при выводе вещественно числа
cout.fill('#'); // заполнитель поля вывода #
cout<<a;
cout.width(40);// установили ширину поля вывода 40 символов
cout<<b;
getch();
}
Заметим, что если бы мы не использовали в программе функцию cout.setf(ios::fixed), то функция cout.precision(2) определяла бы количество всех разрядов выводимого числа, а не количество разрядов его дробной части. Кроме того, обратим внимание на повторное использование функции cout.width() перед выводом значения переменной b. Оно обязательно, так как по умолчанию ширина поля равна длине принятого представления выводимого значения.
Более простой способ изменения параметров и флагов форматирования обеспечивают манипуляторы - специальные функции, позволяющие программисту изменять состояния и флаги потока. Манипуляторы библиотеки классов ввода-вывода языка С++ делятся на 2 группы: манипуляторы с параметрами и манипуляторы без параметров. Примерами манипуляторов без параметров служат манипуляторы dec, hex, осt,которые при вводе и выводе устанавливают флаг десятичной, шестнадцатеричной, восьмеричной системы счисления соответственно (до следующего явного изменения) и манипулятор endl , который обеспечивает включение в выходной поток символа новой строки. Манипуляторы с параметрами определены в файле iomanip.h. Наиболее используемые манипуляторы:
setw (x), где x- целое число, задающее минимальную ширину поля вывода;
setfill (x), где x определяет символ заполнения поля ввода до минимальной величины, определенной переменной width;
setpresiction (x), где x – целое число, задающее точку представления вещественных чисел, то есть максимальное количество цифр дробной части при выводе.
Пример 2. Ввести с клавиатуры и вывести на экран целое число в десятичном, шестнадцатеричном и восьмеричном виде следующим образом:
$$$$$$$$$$$$$$$$$$$$$$$$$$$11 0xb 013$$$$$$$$$$$$$$$$$$$$$$$$$$$$
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
void main()
{
int i;
cout << "\nEnter number\n";
cin>>i;
clrscr();
cout.setf(ios::showbase); //выводить признак основания
//системы счисления
cout<<setw (30)<<setfill('$')<<i<<' '<<hex<<i;
cout<<" "<<oct<<i<<setw(30)<<'\n';
getch();
}
Дата добавления: 2015-10-09; просмотров: 1055;