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

Интервал:

Закладка:

Сделать

void f() {

char* x = asctime(localtime(time(0)));

wait_for_15_seconds(); // выполняет длительную задачу обработки

asctime(localtime(time(0)));

cout << x << endl; // печатает текущее время, а не то что 15 секунд назад.

}

5.2. Форматирование даты/времени в виде строки

Проблема

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

Решение

Используйте шаблон класса time_putиз заголовочного файла , как показано в примере 5.4.

Пример 5.4. Форматирование строки даты/времени

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

ostream& formatDateTime(ostream& out, const tm& t, const char* fmt) {

const time_put& dateWriter = use_facet >(out.getloc());

int n = strlen(fmt);

if (dateWriter.put(out, out, ' ', &t, fmt, fmt + n).failed()) {

throw runtime_error("невозможно отформатировать дату и время");

}

return out;

}

string dateTimeToString(const tm& t, const char* format) {

stringstream s;

formatDateTime(s, t.format);

return s.str();

}

tm now() {

time_t now = time(0);

return *localtime(&now);

}

int main() {

try {

string s = dateTimeToString(now(), "%A %B, %d %Y %I:%M%p");

cout << s << endl;

s = dateTimeToString(now(), "%Y-%m-%d %H:%M:%S);

cout << s << endl;

} catch(...) {

cerr << "невозможно отформатировать дату и время" << endl;

return EXIT FAILURE.

}

return EXIT_SUCCESS;

}

Вывод программы из примера 5.4 будет содержать нечто подобное следующему, в зависимости от локальных настроек.

Sunday July, 24 2005 05:48PM 2005-07-24 17:48:11

Обсуждение

Метод putиз time_putиспользует спецификатор форматирования строки, аналогичный строке формата функции С printf. Символы строки формата выводятся в выходной буфер по мере их появления при условии, что им не предшествует символ %. Символ, перед которым стоит %, — это спецификатор формата, который имеет специальное значение, приведенное в табл. 5.1. Спецификаторы формата также поддерживают модификаторы, такие как целое число, указывающее длину поля, как в %4B.

Tабл. 5.1. Спецификаторы формата даты/времени

Спецификатор Описание
a Сокращенное название дня недели (например, Mon (пн))
A Полное название дня недели (например, Monday (понедельник))
b Сокращенное название месяца (например, Dec (дек))
B Полное название месяца (например, May (май))
c Полные дата и время
d День месяца (01-31)
H Час (00-23)
I Час (01-12)
j День года (001-366)
m Месяц (01-12)
M Минуты (00-59)
p Признак AM/PM
S Секунды, включая до двух секунд координации
U Номер недели (00-53), причем неделя 1 начинается в первое воскресенье
w День недели (0-6), где 0 — это воскресенье
W Номер недели (00-53), причем неделя 1 начинается в первый понедельник
x Дата в формате MM/DD/YY
X Время в формате HH/MM/SS и 24-часовыми часами
y Год текущего столетия (00-99)
Y Год
Z Сокращение временной зоны (часового пояса), или пустая строка, если зона неизвестна

Библиотека Boost date_time, обсуждаемая в дальнейших рецептах, не содержит возможностей форматирования, предлагаемых time_put. Для удобства пример 5.5 содержит несколько процедур, преобразующих классы даты/времени Boost в формат структуры tm, так что вы можете использовать процедуры time_put.

Пример 5.5. Преобразование из классов даты/времени Boost в структуру tm

using boost::gregorian;

using boost::posix_time;

void dateToTmAux(const date& src, tm& dest) {

dest.tm_mday = src.day();

dest tm_year = src.year() - 1900;

dest.tm_mon = src.month() - 1;

}

void ptimeToTmAux(const ptime& src, tm& dest) {

dest.tm_sec = src.seconds();

dest.tm_min = st.minutes();

dest.tm_hour = src.hours();

dateToTmAux(src.date(), dest);

}

tm ptimeToTm(const ptime& t) {

tm ret = tm();

ptimeToTmAux(t.ret);

return ret;

}

Смотри также

Рецепт 13.3.

5.3. Выполнение вычислений с датами и временем

Проблема

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

Решение

Если обе временные точки находятся между 1970 и 2038 годами, то используйте тип time_tи функцию difftime, определенную в заголовочном файле . Пример 5.6 показывает, как вычислить число дней, прошедших между двумя датами.

Пример 5.6. Вычисление даты и времени в формате time_t

#include

#include

#include

using namespace std;

time_t dateToTimeT(int month, int day, int year) {

// 5 января 2000 года передается как (1, 5, 2000)

tm tmp = tm();

tmp.tm_mday = day;

tmp.tm_mon = month - 1;

tmp.tm_year = year - 1900;

return mktime(&tmp);

}

time_t badTime() {

return time_t(-1);

}

time_t now() {

return time(0);

}

int main() {

time_t date1 = dateToTimeT(1,1,2000);

time_t date2 = dateToTimeT(1,1,2001);

if ((date1 == badTime()) || (date2 == badTime())) {

cerr << "невозможно создать структуру time_t" << endl;

return EXIT_FAILURE;

}

double sec = difftime(date2, date1);

long days = static_cast(sec / (60 * 60 — 24));

cout << число дней между 1 января 2000 г. и 1 января 2001 г. составляет ";

cout << days << endl;

return EXIT_SUCCESS;

}

Программа из примера 5.6 должна вывести:

число дней между 1 января 2000 г. и 1 января 2001 г. составляет 366

Обратите внимание, что 2000 год високосный, так как, несмотря на то что он делится на 100, он также делится и на 400 и, следовательно, состоит из 366 дней.

Обсуждение

Тип time_t— это зависящий от реализации арифметический тип. Это означает, что это либо целый тип, либо тип с плавающей точкой, и, таким образом, он поддерживает основные арифметические операции. Его можно складывать, вычитать, делить, умножать и т.д. Чтобы вычислить интервал между двумя значениями time_tв секундах, используйте функцию difftime. Не думайте, что сам time_tсодержит секунды, даже если это и так. Многие реализации C++ могут в ближайшем будущем молча изменить его так, чтобы он содержал доли секунд (это одна из причин, по которым difftimeвозвращает double).

Если ограничения time_tслишком жестки, то вместо него для вычисления временных интервалов потребуется использовать различные классы из библиотеки Boost date_time. Пример 5.7 показывает, как использовать классы Boost для вычисления числа дней в 20-м и 21-м столетиях.

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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