Шаблонний клас std::num_get призначений для розпізнавання дати з послідовності символів. Являється facet-об'єктом локалі (похідний від класу locale::facet). Оголошення приблизно виглядає наступним чином:
template <class charT,
class InputIterator = istreambuf_iterator<charT> >
class time_get ;
Параметр шаблону charT призначений для вказування типу символів, з якими буде працювати примірник класу. Параметр шаблону InputIterator призначений для вказування типу ітератора, який буде використовуватись для отримання послідовності символів.
Даний клас має захищений конструктор - програми не повинні створювати примірники безпосередньо даного класу, вони повинні створювати примірники дочірніх даному класів або використовувати готові примірники, які містяться у об'єктах локалей за допомогою std::use_facet.
Стандартні об'єкти локалей повинні підтримувати наступний мінімальний набір спеціалізованих примірників класу:
- time_get<char> - призначений для роботи з байтовими послідовностями символів з стандартним ітератором вводу;
- time_get<wchar_t> - призначений для роботи з розширеним типом символів і стандартним ітератором вводу.
Щоб використовувати даний клас, у код необхідно підключити файл locale:
#include <locale> /* усе корисне разом з time_get */
Нутрощі класу
explicit time_get (size_t refs=0) ;
Конструктор класу. Параметр refs призначений для управління автоматичним видаленням об'єктів класу:
- значення 0 (нуль) спричиняє автоматичне видалення примірника класу, коли останній об'єкт локалі, в'язаний з даним, удаляється;
- значення 1 означає вимкнення автоматичного видалення об'єкту.
dateorder date_order () const ;
Метод повертає значення перелічення, яке відображає порядок розміщення ознак дня, місяця і року відносно один-одного, яке відображає поведінку поточної локалі. Можливі значення:
- no_order - порядок не вказано;
- dmy - день, місяць і рік;
- mdy - місяць, день і рік;
- ymd - рік, місяць і день;
- ydm - рік, день і місяць.
iter_type get_date (iter_type s,
iter_type end,
ios_base& str,
ios_base::iostate& err,
tm* t) const ;
Читає послідовність символів і розпізнає дату. Параметр s призначений для вказування ітератора потоку вводу, з якого метод буде отримувати послідовність символів. Параметр str призначений для вказування об'єкта, клас якого похідний від ios_base, і який використовується для отримання інформації форматування. Параметр err призначений для отримання значення, яке описує помилку, в разі її виникнення. Параметр tm призначений для передачі адреси на структуру struct tm (яка визначена у файлі ctime або time.h), відповідні поля якої заповнюються методом.
Метод повертає ітератор на символ послідовності потоку вводу, який стоїть після останнього символу, що відноситься до дати.
Даний метод являється делегатом, тобто викликає захищений метод do_get_time, який реалізовується дочірніми класами.
iter_type get_monthname (iter_type s,
iter_type end,
ios_base& str,
ios_base::iostate& err,
tm* t) const ;
Призначений для зчитування ім'я місяця. Параметр s призначений для вказування ітератору вводу, який буде використовуватись для отримання послідовності символів. Параметр end призначений для вказування ітератора, який вказує на елемент, що стоїть після останнього символу дати. Параметр str являється об'єктом похідним від класу ios_base (зазвичай об'єкт потокового вводу). Використовується для отримання інформації про форматування. Параметр err призначений для утримування значення, яке описує помилку, що виникла під час діяльності методу. Параметр t призначений для передавання вказівника на структуру struct tm, що використовується для утримування інформації про час (оголошується у файлі ctime або time.h).
Метод повертає ітератор на елемент, що стоїть після останнього прочитаного символу, який відноситься до прочитаної дати і заповнює відповідні поля структури struct tm t.
Даний метод являється делегатом - він викликає захищений метод do_get_monthname, який реалізовується у потомках даного класу.
iter_type get_time (iter_type s,
iter_type end,
ios_base& str,
ios_base::iostate& err,
tm* t) const ;
Метод призначений для зчитування послідовності символів і визначення значення часу дня. Параметр s призначений для вказування ітератора вводу, за допомогою якого метод зчитує послідовність символів. Параметр end призначений для передавання ітератора, який вказує на кінець послідовності, яку необхідно зчитати. Параметр str призначений для вказування об'єкту, клас якого похідний від ios_base (зазвичай примірник об'єкту потокового вводу). Використовується для отримання інформації про форматування. Параметр err призначений для передачі змінної, яка буде містити значення, що характеризує помилку, яка виникла під час роботи методу. Параметр t являється примірником структури struct tm (яка оголошується у файлі ctime або time.h) і призначений для утримування результату розпізнавання часу.
Метод повертає ітератор, що вказує на символ, який стоїть після останнього прочитаного символу часу.
Метод являється делегатом - він викликає захищений метод do_get_time, який реалізовується у потомках даного класу.
iter_type get_weekday (iter_type s,
iter_type end,
ios_base& str,
ios_base::iostate& err,
tm* t) const ;
Зчитує послідовність символів і розпізнає день тижня. Параметр s призначений для вказування ітератора, за допомогою якого метод зчитує послідовність символів. Параметр end призначений для передавання ітератора, який вказує на кінець послідовності символів, що необхідно зчитати. Параметр str призначений для вказування об'єкта, клас якого похідний від ios_base (зазвичай це об'єкт потокового вводу), використовується для отримання інформації про форматування. Параметр err призначений для утримування значення, яке характеризує помилку, яка виникла під час роботи методу. Параметр t призначений для передачі примірника структури struct tm, яка утримує результат розпізнавання і оголошується у файлі ctime або time.h.
Метод повертає ітератор, який вказує на елемент, що стоїть після останнього прочитаного методом.
Метод являється делегатом - він викликає захищений метод do_get_weekday, який реалізовується потомками даного класу.
iter_type get_year (iter_type s,
iter_type end,
ios_base& str,
ios_base::iostate& err,
tm* t) const ;
Метод зчитує послідовність символів і розпізнає рік, який вони відображають. Параметр s призначений для вказування ітератора, за допомогою якого метод зчитує послідовність символів. Параметр end призначений для передавання ітератора, який вказує на кінець послідовності символів, що необхідно зчитати. Параметр str призначений для вказування об'єкта, клас якого похідний від ios_base (зазвичай це об'єкт потокового вводу), використовується для отримання інформації про форматування. Параметр err призначений для утримування значення, яке характеризує помилку, яка виникла під час роботи методу. Параметр t призначений для передачі примірника структури struct tm, яка утримує результат розпізнавання і оголошується у файлі ctime або time.h.
Метод повертає ітератор, який вказує на елемент, що стоїть після останнього прочитаного методом.
Метод являється делегатом - він викликає захищений метод do_get_year, який реалізовується потомками даного класу.
Приклад
Простий приклад використання класу.
#include <locale> /* time_get і все корисне */
#include <string.h>
#include <time.h>
#include <iterator>
#include <iostream> /* об'єкт wcout */
using namespace std ; /* друкуємо без std */
/* головна функція програми */
int main (int argc, char** argv)
{
/* створюємо бажану локаль
** вказану користувачем */
locale loc ("uk_UA.UTF-8") ;
/* перевіряємо присутність потрібного нам facet-об'єкта */
if (!has_facet< time_get<wchar_t> > (loc))
{
/* якщо facet-об'єкт відсутній -
** виводимо повідомлення і
** завершуємо роботу програми */
/* УВАГА! Кирилиця може некоректно відображатись
** у терміналах, які не підтримують UTF-8!!! */
cout << "Локаль " << loc.name() << " немає time_get<wchar_t>." ;
return 0 ;
}
/* отримуємо необхідний примірник time_get */
const time_get<wchar_t>& tg = use_facet < time_get<wchar_t> > (loc) ;
/* структура для утримування значення часу */
tm stime ;
/* ітератори вводу */
istreambuf_iterator<wchar_t> iit (wcin.rdbuf()) ;
istreambuf_iterator<wchar_t> iite ;
/* змінна для утримування значення помилки */
ios_base::iostate err = ios_base::goodbit ;
/* підготовлюємо змінну stime
** - заповнюємо її область пам'яті нулями */
memset (&stime,0,sizeof(stime)) ;
/* виводимо запрошення у термінал */
/* УВАГА! Кирилиця може некоректно відображатись
** у терміналах, які не підтримують UTF-8!!! */
cout << "Введіть дату і час: " ;
/* спочатку вводимо дату */
iit = tg.get_date (iit, iite, wcin, err, &stime) ;
/* після чого вводимо час, ++itt
** - пропускаємо один пробіл */
tg.get_time (++iit, iite, wcin, err, &stime) ;
/* виводимо результат зчитування */
cout << "введені день : " << stime.tm_mday << endl
<< "введені місяць : " << stime.tm_mon << endl
<< "введені рік : " << stime.tm_year << endl
<< "введені години : " << stime.tm_hour << endl
<< "введені хвилини: " << stime.tm_min << endl
<< "введені секунди: " << stime.tm_sec << endl ;
return 0 ;
}
Вивід програми:
Як бачимо, хоча було вказано безпосереднє використання локалі "uk_UA.UTF-8", клас все-одно читає правильно тільки американський стиль дати - місяць, день, рік, розділені слешом (що, напевно, відповідає стандартній локалі). Скоріш за все у моєму дистрибутиві Linux Mint неправильно налаштована локаль.