- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
C++. Сборник рецептов - Д. Стефенс
Шрифт:
Интервал:
Закладка:
Действие всех манипуляторов сохраняется до тех пор, пока оно не будет явно изменено, исключая манипулятор setw. Из примера 10.1 видно, что он вызывается перед каждой записью, однако left используется только один раз. Это объясняется тем, что ширина поля устанавливается в нуль после записи каждого значения в поток при помощи оператора operator<<; чтобы обеспечить одинаковую ширину всех полей, мне пришлось каждый раз вызывать setw.
Стандартные манипуляторы позволяют делать многое, но не все. Если у вас возникает потребность в написании собственного манипулятора, см. рецепт 10.2.
Как и все другие классы стандартной библиотеки, работающие с символами, манипуляторы работают с потоками узких или широких символов. Поэтому вы можете использовать их в шаблонах для написания утилит форматирования, обрабатывающих потоки символов любого вида. В примере 10.2 приводится шаблон класса TableFormatter, который форматирует данные в колонки одинаковой ширины и выдает их в поток.
Пример 10.2. Параметрический класс для табличного представления данных
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
using namespace std;
// TableFormatter выдает в поток вывода символы типа T в форматированном
// виде.
template<typename T>
class TableFormatter {
public:
TableFormatter(basic_ostream<T>& os) : out_(os) {}
~TableFormatter() {out_ << flush;}
template<typename valT>
void writeTableRow(const vector<valT>& v, int width);
//...
private:
basic_ostream<T>& out_;
};
template<typename T, // ссылается на список параметров шаблона класса
typename valT> // ссылается на список параметров функции-члена
void TableFormatter<T>::writeTableRow(const std::vector<valT>& v,
int width) {
ios_base::fmtflags flags = out_.flags();
out_.flush();
out_ << setprecision(2) << fixed; // Задать точность в случае применения
// чисел с плавающей точкой
for (vector<valT>::const_iterator p = v.begin(); p != v.end(); ++p)
out_ << setw(width) << left << *p; // Установить ширину поля, его
// выравнивание и записать элемент
out_ << endl; // Очистить буфер
out setf(flags); // Восстановить стандартное состояние флагов
}
int main() {
TableFormatter<char> fmt(cout);
vector<string> vs;
vs.push_back("Sunday");
vs.push_back("Monday");
vs.push_back("Tuesday");
fmt.writeTableRow(vs, 12);
fmt.writeTableRow(vs, 12);
fmt.writeTableRow(vs, 12);
vector<double> vd;
vd.push_back(4.0);
vd.push_back(3.0);
vd.push_back(2.0);
vd.push_back(1.0);
fmt.writeTableRow(vd, 5);
}
Вывод представленной в примере 10.2 программы выглядит следующим образом.
Sunday Monday Tuesday
4.00 3.00 2.00 1.00
Смотри такжеТаблица 10.1, рецепт 10.2.
10.2. Форматирование вывода чисел с плавающей точкой
ПроблемаТребуется выдать числа с плавающей точкой в удобном формате либо ради обеспечения необходимой точности (применяя нотацию, которая используется в науке, а не в виде числа с фиксированной точкой), либо просто выравнивая значения по десятичной точке для лучшего восприятия.
РешениеИспользуйте стандартные манипуляторы, определенные в <iomanip> и <ios>, для управления форматом значений чисел с плавающей точкой при их записи в поток. Это можно делать очень многими способами, и в примере 10.3 предлагается несколько способов отображения значения числа «пи».
Пример 10.3. Форматирование числа «пи»
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main() {
ios_base::fmtflags flags = // Сохранить старые флаги
cout.flags();
double pi = 3.14285714;
cout << "pi = " << setprecision(5) // Обычный (стандартный) режим;
<< pi << 'n'; // показать только 5 цифр в сумме
// по обе стороны от точки.
cout << "pi = " << fixed // Режим чисел с фиксированной точкой;
<< showpos // выдать "+" для положительных чисел.
<< setprecision(3) // показать 3 цифры *справа* от
<< pi << 'n'; // десятичной точки.
cout << "pi = " << scientific // Режим научного представления;
<< noshowpos // знак плюс больше не выдается
<< pi * 1000 << 'n';
cout.flags(flags); // Восстановить значения флагов
}
Это приведет к получению следующего результата.
pi = 3.1429
pi = +3.143
pi = 3.143е+003
ОбсуждениеМанипуляторы, работающие с числами с плавающей точкой, делятся на две категории. Одни из них задают формат и в данном рецепте устанавливают общий вид целых значений и значений чисел с плавающей точкой, а другие используются для тонкой настройки каждого формата. Предусмотрены следующие форматы.
Обычный (стандартный)
В этом формате фиксировано количество отображаемых цифр (по умолчанию это количество равно шести), а десятичная точка отображается в соответствующем месте. Поэтому число «пи» по умолчанию будет иметь вид 3.14286, а умноженное на 100 будет отображаться как 314.286.
Фиксированный
В этом формате фиксировано количество цифр, отображаемое справа от десятичной точки, а количество цифр слева не фиксировано. В этом случае при стандартной точности, равной шести, число «пи» будет отображаться в виде 3.142857, а умноженное на 100 — 314.285714. В обоих случаях количество цифр, отображаемое справа от десятичной точки, равно шести, а общее количество цифр может быть любым.
Научный
Значение начинается с цифры, затем идет десятичная точка и несколько цифр, количество которых определяется заданной точностью; затем идет буква «е» и степень 10, в которую надо возвести предыдущее значение. В этом случае число «пи», умноженное на 1000, будет отображаться как 3.142857е+003.
В табл. 10.2 приводятся все манипуляторы, которые воздействуют на вывод чисел с плавающей точкой (а иногда и на вывод любых чисел). См. табл. 10.1, где приводятся манипуляторы общего типа, которые можно использовать совместно с манипуляторами чисел с плавающей точкой.
Табл. 10.2. Манипуляторы, работающие с любыми числами и числами с плавающей точкой
Манипулятор Описание Пример вывода fixed Показать значение чисел с плавающей точкой с фиксированным количеством цифр справа от десятичной точки При стандартной точности, равной шести цифрам: pi = 3.142857 scientific Показать значение чисел с плавающей точкой, применяя научную нотацию, в которой используется значение с десятичной точкой и экспонентный множитель pi * 1000 при стандартной точности, равной шести цифрам: pi = 3.142857е+003 setprecision Установить количество цифр, отображаемых в выводе (см. последующие объяснения) Число «пи» в стандартном формате при точности, равной трем цифрам: pi = 3.14 В фиксированном формате: pi = 3.143 В научном формате: pi = 3.143е+000 showpos noshowpos Показать знак «плюс» перед положительными числами. Это действует для чисел любого типа, с десятичной точкой или целых +3.14 showpoint noshowpoint Показать десятичную точку, даже если после нее идут одни нули. Это действует только для чисел с плавающей точкой и не распространяется на целые числа Следующая строка при точности, равной двум цифрам: cout << showpoint << 2.0 выдаст такой результат: 2.00 showbase noshowbase Показать основание числа, представленного в десятичном виде (основание отсутствует), в восьмеричном виде (ведущий нуль) или в шестнадцатеричном виде (префикс 0x). См. следующую строку таблицы Десятичное представление: 32 Восьмеричное: 040 Шестнадцатеричное: 0x20 dec oct hex Установить основание для отображения числа в десятичном, восьмеричном или шестнадцатеричном виде. Само основание по умолчанию не отображается; для его отображения используйте showbase См предыдущую строку таблицы uppercase nouppercase Отображать значения, используя верхний регистр Устанавливает регистр вывода чисел, например для префикса 0X шестнадцатеричных чисел или буквы E для чисел, представленных в научной нотацииВсе манипуляторы, кроме setprecision, одинаково воздействуют на все три формата. В стандартном режиме «точность» определяет суммарное количество цифр по обе стороны от десятичной точки. Например, для отображения числа «пи» в стандартном формате с точностью, равной 2, выполните следующие действия.

