Д. Стефенс - 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++. Сборник рецептов - читать книгу онлайн бесплатно, автор Д. Стефенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать
Смотри также

Рецепт 13.4.

13.3. Запись и чтение дат и времен

Проблема

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

Решение

Используйте тип time_tи tm structиз , а также фасеты даты и времени, предусмотренные в , для записи и чтения дат и времен (фасеты вскоре будут рассмотрены при обсуждении примера). См. пример 13.4.

Пример 13.4. Запись и чтение дат

#include

#include

#include

#include

#include

using namespace std;

void translateDate(istream& in, ostream& out) {

// Создать считывающий дату объект

const time get& dateReader =

use_facet >(in.getloc());

// Создать объект состояния который будет использован фасетом для

// уведомления нас о возникновении проблемы

ios_base::iostate state = 0;

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

istreambuf_iterator end;

tm t; // Структура для представления времени (из )

// Теперь, когда все подготовлено, считать дату из входного потока

// и поместить ее в структуру времени.

dateReader.get_date(in, end, in, state, &t);

// В данный момент дата находится в структуре tm. Вывести ее в поток,

// используя соответствующую локализацию. Убедитесь, что выводятся только

// достоверные данные из t.

if (state == 0 || state == ios_base::eofbit) { // Чтение выполнено успешно.

const Time_put& dateWriter =

use_facet >(out.getloc());

char fmt[] = "%x";

if (dateWriter.put{out, out, out.fill(),

&t, &fmt[0], &fmt[2]).failed())

cerr << "Unable to write to output stream.\n";

} else {

cerr << "Unable to read cin!\n";

}

}

int main() {

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

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

translateDate(cin, cout);

}

Эта программа выдает следующий результат

3/28/2005

28.03.2005

Обсуждение

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

В C++ нет стандартного класса для представления даты и времени, а наиболее подходящими для этого типами являются time_tи структура tmиз . Если требуется записывать и считывать даты с использованием средств стандартной библиотеки, вам придется любое нестандартное представление даты преобразовывать в структуру tm. Это имеет смысл, поскольку используемые вами реализации, вероятно, уже имеют встроенную поддержку форматирования дат с учетом местных особенностей.

Ранее я говорил, что фасет определяет некоторый аспект локализации, отражающий ее особенности. Более конкретно, фасет — это константная инстанциация шаблона класса символьного типа, поведение которого зависит от класса локализации, используемого при конструировании. В примере 13.4 я следующим образом создаю экземпляр фасета time_get.

const time_get& dateReader =

use_facet >(in.getloc());

Шаблон функции use_facetнаходит заданный фасет для заданной локализации. Все стандартные фасеты являются шаблонами классов, которые принимают параметр символьного типа, и, поскольку мною считываются и записываются символы типа char, я инстанцирую мой класс time_getдля char. Стандарт требует, чтобы реализация обеспечивала специализацию шаблона для charи wchar_t, поэтому они гарантированно существуют (хотя не гарантируется поддержка заданной локализации, кроме локализации С). Созданный мною объект time_getимеет спецификатор const, потому что предусмотренная реализацией функциональность локализации это набор правил форматирования различного вида данных в разных локализациях, и эти правила не могут редактироваться пользователем, поэтому состояние заданного фасета не должно изменяться в программном коде, где он используется.

Локализация, передаваемая мною в функцию use_facet, связана с потоком, в который я собираюсь записывать данные. Функция getloc()объявляется в ios_base; она возвращает локализацию, связанную с потоком ввода или вывода. Наилучший подход — применение локализации, уже связанной с потоком, который вы собираетесь использовать для ввода или вывода данных; передача в качестве параметра или каким-либо другим способом имени локализации легко приводит к ошибкам.

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

ios_base::iostate state = 0;

Сами фасеты не модифицируют состояние потока (например, устанавливая stream::failbit = 1); вместо этого они установят соответствующее значение в вашем объекте состояния, показывая, что дату нельзя считывать. Это объясняется тем, что чтение форматированного значения терпит неудачу не обязательно из-за потока; поток ввода символов может быть в полном порядке, однако его чтение с использованием нужного вам формата может оказаться невозможным.

Реальное значение даты хранится в структуре tm. Вам требуется только создать локальную переменную типа tm и передать ее адрес фасету time_getили time_put.

Считав дату, я могу проверить значение переменной, которую я использую для контроля состояния потока. Если это значение равно нулю или ios_base::eofbit, то это говорит о том, что поток находится в нормальном состоянии и что моя дата была считана без проблем. Поскольку в примере 13.4 мне нужно было записать дату в другой поток, пришлось создать объект, используемый именно для этой цели. Я делаю это следующим образом.

const time_put& dateWriter =

use_facet >(out.getloc());

Это работает так же, как и предыдущая инстанциация класса time_get, но в другом направлении. После этого я создал строку форматирования (используя синтаксис, подобный применяемому в функции printf), которая будет печатать дату. « %x» выводит дату, а « %X» выводит время. Однако следует быть осторожным: в этом примере считывается только дата, поэтому члены структуры tm, относящиеся ко времени, в этот момент имеют неопределенные значения.

Теперь можно писать данные в поток вывода. Это делается следующим образом.

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

out, // Лоток вывода

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

&t, // Адрес структуры tm

&fmt[0], // Начало и конец строки форматирования

&fmt[2]

).failed()) // iter_type.failed() показывает, была или

// нет ошибка при записи

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

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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