Четверг, 09.01.2025, 11:49
Главная Регистрация RSS поиск
Приветствую Вас, Гость
Меню сайта
Категории раздела
HTML [44]
Visual C++ и MFC [21]
c++ [78]
php [19]
Javascript [15]
C# [51]
загрузки [0]
XNA [10]
создание игр с помощью xna
Наш опрос
Каким языком программирования вы увлекаетесь
Всего ответов: 2420
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Реклама
Главная » Статьи » c++

Форматирование ввода-вывода средствами языка С++

Чтобы, например, указать ширину полей, левое или правое выравнивание и т.д. можно использовать printf(), а можно сделать то же самое при помощи средств форматирования ввода/вывода языка С++. Существуют два способа форматирования ввода/вывода, которые мы по очереди рассмотрим в данной главе.

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

enum { skipws = 0x0001,
 left = 0x0002,
 right = 0x0004,
 internal = 0x0008,
 dec = 0x0010,
 oct = 0x0020,
 hex = 0x0040,
 showbase = 0x0080,
 showpoint = 0x0100,
 uppercase = 0x0200,
 showpos = 0x0400,
 scientific = 0x0800,
 fixed = 0x1000,
 unitbuf = 0x2000,
 stdio = 0x4000 
};

Рассмотрим что делают перечисленные выше флаги.

Флаг Описание
skipws Следующие в начале символы-разделители (пробелы, символы табуляции и новой строки) при выполнении ввода отбрасываются.
left Осуществляется ввод с левым выравниванием
right Осуществляется ввод с правым выравниванием (по умолчанию)
internal Знак или префикс системы счисления выравнивает слева, число выравнивает справа
dec Численные значения выводятся в десятичной форме (по умолчанию)
oct Численные значения выводятся в восьмеричной форме
hex Численные значения выводятся в шестнадцатиричной форме
showbase Позволяет при выводе указывать числовую базу (десятичную, восьмеричную, шестнадцатиричную)
showpoint Приводит к выводу десятичной запятой и нулей справа для всех чисел с плавающей запятой вне зависимости, нужно это или нет
uppercase При выводе чисел с плавающей точкой при использовании экспоненциальной формы выводится большая буква E. Также при выводе чисел в шестнадцатиричной форме символ 'x' выводится в верхнем регистре.
showpos Приводит к тому, что перед положительным числом будет выводится знак "+"
scientific Числа с плавающей запятой выводятся с использованием научной нотации
fixed Числа с плавающей запятой выводятся в нормальной нотации
unitbuf При каждой операции вставки вывода данные немедленно заносится в поток

Что делают флаги мы рассмотрели. Теперь необходимо познакомиться с функциями, которые устанавливают и сбрасывают эти флаги.

Первая функция, которую мы рассмотрим, - это функция setf(), используемая для установки флагов

long setf(long flags);

Функция принимает в качестве параметра рассмотренные выше флаг или флаги, соединенные между собой при помощи побитового ИЛИ. Она возвращает предыдущее значение флага. Рассмотрим пример:

 cout.setf(ios::hex);
 cout.setf(ios::showpos);
 cout<<123<<" "<<123.45<<"\n"; 
 cout<<67<<" "<<678.9<<"\n";
выведет на экран
 7b +123.45
 43 +678.9
 
тоже самое будет на экране после выполнения следующего кода
 cout.setf(ios::hex | ios::showpos);
 cout<<123<<" "<<123.45<<"\n"; 
 cout<<67<<" "<<678.9<<"\n";

Для отключения установленных флагов нужно использовать функцию unsetf(). Она имеет следующий прототип:

long unsetf(long flags);

Функция возвращает значение предыдущей установки флага и сбрасывает флаги, определяемые параметром flags. Пример:

 cout.setf(ios::showpos | ios::hex);
 cout<<123<<" "<<123.45<<"\n";
 cout.unsetf(ios::showpos | ios::hex);
 cout<<123<<" "<<123.45<<"\n";
выведет на экран
 7b +123.45
 123 123.45

Кроме флага форматирования также можно установить ширину поля потока, символ для заполнения и число цифр после десятичной запятой. Для этого используются следующие функции:

int width(int len);
char fill(char ch);
int precision(int num);

Функция width() устанавливает ширину поля и возвращает текущую ширину. Вторая функция - fill() устанавливает текущий символ заполнения и возвращает предыдущий символ заполнения. По умолчанию используется пробел. А функция precision устанавливает точность чисел с плавающей точкой. В научном режиме эта функция определяет количество цифр после десятичной запятой. В обычной нотации функция обозначает количество выводимых цифр. Точность, установленная по умолчанию, равна 6. Функция width() воздействует только на один вывод информации, а после этого в действие вступают параметры принятые по умолчанию. В случае с остальными двумя функциями новые установки остаются действовать до их явного обновления. Приведем пример:

 cout.width(10);
 cout.fill('*');
 cout<<123<<"\n";
 cout.width(10);
 cout<<456<<"\n\n"; 
 cout<<"Using precision\n";
 float price1 = 20.405f;
 float price2 = (float)1.9+8.0/9.0;
 cout<<price1<<"\n"<<price2<<"\n\n";
 cout.precision(2);
 cout<<price1<<"\n"<<price2<<"\n\n";
 cout.setf(ios::scientific);
 cout<<price1<<"\n"<<price2<<"\n\n";

выведет на экран

 *******123
 *******456

 Using precision
 20.405
 2.78889

 20
 2.8

 2.04e+001
 2.79e+000

А теперь мы переходим к рассмотрению второго способа форматирования ввода/вывода. Второй способ - это использование манипуляторов.

Манипуляторы являются специальными функциями, которые позволяют изменять флаги потока. Существуют манипуляторы с параметрами и без. Если Вы используете манипуляторы с параметрами, подключите файл iomanip.h

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

ends - помещает в выходной поток нулевой символ;
endl помещает в выходной поток символ конца строки и вызывает метод flush;
flush выгружает буфер потока;
dec, hex, oct устанавливают основания 10, 16 и 8 соответственно;
ws заставляет игнорировать ведущие пробелы при вводе.

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

setbase(int b) задает основание системы счисления;
resetiosflags(long f) сбрасывает флаги, указанные в параметре;
setiosflags(long f) устанавливает флаги, указанные в параметре;
setfill(int ch) задает заполняющий символ;
setprecision(int n) задает точность вещественных чисел;
setw(int n) задает ширину поля.

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

 cout<<setw(5)<<setfill('*')<<22<<endl;
 cout<<hex<<11<<endl;
выведет на экран
 ***22
 b
Категория: c++ | Добавил: slava (30.05.2011)
Просмотров: 6796 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]