Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Форматирование данных при обменах с потоками ввода-вывода




Данные при обмене с потоками ввода-вывода используют стандартный формат внешнего представления. Например, при выводе чисел каждое из них занимает ровно столько позиций, сколько необходимо для его представления: число 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();

}

 

 




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 349; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.