Д. Стефенс - C++. Сборник рецептов

Тут можно читать онлайн Д. Стефенс - C++. Сборник рецептов - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство КУДИЦ-ПРЕСС, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    C++. Сборник рецептов
  • Автор:
  • Жанр:
  • Издательство:
    КУДИЦ-ПРЕСС
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    5-91136-030-6
  • Рейтинг:
    3.9/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Д. Стефенс - C++. Сборник рецептов краткое содержание

C++. Сборник рецептов - описание и краткое содержание, автор Д. Стефенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.

C++. Сборник рецептов - читать онлайн бесплатно полную версию (весь текст целиком)

C++. Сборник рецептов - читать книгу онлайн бесплатно, автор Д. Стефенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

get_dateне единственная функция-член, которую можно использовать для получения компонент даты из потока. Ниже перечислены некоторые из них.

get_date

Получает дату из потока, используя местные правила форматирования.

get_time

Получает время из потока, используя местные правила форматирования.

get_weekday

Получает название дня недели, например Monday, lundi, понедельник.

get_year

Получает год, используя местные правила форматирования.

Может быть полезной также функция-член date_order. Она возвращает перечисление ( time_base::dateorderиз ), которое определяет порядок месяца, дня и года в дате. Эта функция может помочь в тех случаях, когда вам приходится анализировать вывод даты, полученной функцией time_get::put. Пример 13.5 показывает, как можно проверять порядок элементов, составляющих дату.

Пример 13.5. Определение последовательности элементов в дате

#include

#include

#include

using namespace std;

int main() {

cin.imbue(locale("german"));

const time_get& dateReader =

use_facet >(cin.getloc());

time_base::dateorder d = dateReader.date_order();

string s;

switch (d) {

case time_base::no_order:

s = "No order";

break;

case time_base::dmy:

s = "day/month/year";

break;

case time_base::mdy:

s = "month/day/year";

break;

case time_base::ymd:

s = "year/month/day";

break;

case time_base::ydm:

s = "year/day/month";

break;

}

cout << "Date order for locale " << cin.getloc().name()

<< " is " << s << endl;

}

Имеется еще одно средство, которое может оказаться полезным при инстанцировании фасетов: has_facet. Шаблон этой функции возвращает значение типа bool, показывающее, определен или нет нужный вам фасет в заданной локализации. Поэтому для надежности используйте has_facetво всех случаях, когда вы инстанцируете фасет. Если она возвращает значение «ложь», вы всегда можете перейти к используемой по умолчанию классической локализации С, поскольку ее наличие гарантировано в реализации, отвечающей требованиям стандарта. has_facetприменяется следующим образом.

if (has_facet >(loc)) {

const time_put& dateWriter =

use_facet >(loc);

Разобравшись однажды в синтаксисе классов time_getи time_put, вы поймете, что использовать их достаточно просто. Как всегда, можно воспользоваться typedef, чтобы свести к минимуму количество неприятных угловых скобок.

typedef time_put TimePutNarrow;

typedef time_get TimeGetNarrow;

// ...

const TimeGetNarrow& dateReader = use_facet(loc);

Процедура записи и чтения дат в локализованных форматах немного утомительна, однако, после того как вы один раз разберетесь в требованиях класса локализации locale, вы сможете это делать эффективно и быстро. Глава 5 полностью посвящена датам и временам, поэтому более детальные сведения по форматированию вывода дат и времен вы найдете в рецепте 5.2.

Смотри также

Глава 5 и рецепт 5.2.

13.4. Запись и чтение денежных значений

Проблема

Требуется записать в поток или прочитать из него денежное значение.

Решение

Используйте фасеты money_putи money_getдля записи или чтения денежных значений, как показано в примере 13.6.

Пример 13.6. Запись и чтение денежных значений

#include

#include

#include

#include

using namespace std;

long double readMoney(istream& in, bool intl = false) {

long double val;

// Создать фасет для чтения

const money_get& moneyReader =

use_facet >(in.getloc());

// Маркер конца

istreambuf iterator end;

// Переменная состояния для обнаружения ошибок

ios_base::iostate state = 0;

moneyReader.get(in, end, intl, in, state, val);

// если что-то не получилось, будет установлен бит неудачного завершения

if (state != 0 && !(state & ios_base::eofbit))

throw "Couldn't read money!\n";

return(val);

}

void writeMoney(ostream& out, long double val, bool intl = false) {

// Создать фасет для записи

const money_put& moneyWriter =

use_facet >(out.getloc());

// Записать данные в поток. Вызвать failed() (возвращает итератор

// ostreambuf_iterator), чтобы можно было обнаружить ошибку.

if (moneyWriter.put(out, intl, out, out.fill(), val).failed())

throw "Couldn't write money!\n";

}

int main() {

long double val = 0;

float exchangeRate = 0.775434f; // Курс доллара по отношению к евро

locale locEn("english");

locale locFr("french");

cout << "Dollars: ";

cin.imbue(locEn);

val = readMoney(cin, false);

cout.imbue(locFr);

// Установить флаг showbase, чтобы выводить символ валюты

cout.setf(ios_base::showbase);

cout << "Euros: ";

writeMoney(cout, val = exchangeRate, true);

}

Если выполнить программу примера 13.6, можно получить следующий результат.

Dollars: $100

Euros: EUR77,54

Обсуждение

Фасеты money_putи money_getзаписывают форматированные денежные значения в поток и считывают их из потока. Они работают почти так же, как фасеты даты/времени и числовые фасеты, описанные в предыдущих рецептах. Стандарт требует, чтобы были их реализации для стандартных символов и расширенного набора символов, например money_putи money_put. Как и для других фасетов, функции записи и чтения многословны, но, применив их несколько раз, легко запоминаешь параметры. money_getи money_putиспользуют класс moneypunct, содержащий информацию о форматировании.

Сначала рассмотрим запись денежных значений в поток. Отображение денежной суммы состоит из нескольких частей: знака валюты, знака плюс или минус, разделителя тысяч и десятичной точки. Все они, кроме десятичной точки, могут отсутствовать.

Вы создаете объект money_putс типом символа и локализацией следующим образом.

const money_put& moneyWriter =

use_facet >(out.getloc());

Стандарт требует наличия версий как для char, так и для wchar_t. Разумно использовать локализацию потока, в который осуществляется запись, чтобы избежать несогласованности, возникающей при попытке синхронизации потока и объекта money_put. На следующем шаге вызовите метод put для записи денежного значения в поток вывода.

if (moneyWriter.put(out, // Итератор вывода

intl, // bool: использовать формат intl?

out, // ostream&

out.fill(), // использовать символ заполнителя

val) // денежное значение, тип long double

.failed()) throw "Couldn't write money!\n";

Функция money_put::putзаписывает денежное значение в переданный ей поток вывода, используя локализацию, с которой был создан объект money_put. money_put::putвозвращает итератор ostreambuf_iterator, который ссылается на позицию за последним выведенным символом; этот итератор имеет функцию-член failed, позволяющую зафиксировать ситуацию, когда итератор оказывается испорченным.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Д. Стефенс читать все книги автора по порядку

Д. Стефенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




C++. Сборник рецептов отзывы


Отзывы читателей о книге C++. Сборник рецептов, автор: Д. Стефенс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x