std::time_get<CharT,InputIt>::get, std::time_get<CharT,InputIt>::do_get
Определён в заголовочном файле <locale> | ||
|---|---|---|
public:
iter_type get( iter_type beg, iter_type end, std::ios_base& str,
std::ios_base::iostate& err, std::tm* t,
char format, char modifier = 0 ) const;
| (1) | (начиная с C++11) |
public:
iter_type get( iter_type beg, iter_type end, std::ios_base& str,
std::ios_base::iostate& err, std::tm* t,
const char_type* fmtbeg, const char_type* fmtend ) const;
| (2) | (начиная с C++11) |
protected:
virtual iter_type do_get( iter_type beg, iter_type end, std::ios_base& str,
std::ios_base::iostate& err, std::tm *t,
char format, char modifier ) const;
| (3) | (начиная с C++11) |
do_get наиболее производного класса.[beg, end) в соответствии с форматом, заданным последовательностью символов [fmtbeg, fmtend). Предполагается, что формат соответствует описанному ниже, хотя обработку каждого спецификатора формата можно настроить, переопределив do_get. Функция get выполняет следующие действия: сначала сбрасывает биты ошибок в err, выполняя err = std::ios_base::goodbit. Затем запускается цикл, который завершается при выполнении любого из следующих условий (проверяемых в указанном порядке):fmtbeg == fmtend).err != std::ios_base::goodbit).beg == end). Если цикл завершается по этому условию, функция устанавливает оба флага eofbit и failbit в err.'%', за которым следует один или два символа, образующих допустимый спецификатор преобразования std::get_time (см. ниже), эти символы используются при вызове do_get(beg, end, str, err, t, format, modifier), где format — символ основного спецификатора преобразования, а modifier — необязательный модификатор (если он присутствует, он находится между % и символом формата). Если модификатора нет, используется значение '\0'. Если строка формата неоднозначна или заканчивается слишком рано, чтобы определить спецификатор преобразования после '%', в err устанавливается eofbit, и цикл завершается. Если после вызова do_get в err не установлены биты ошибок, функция увеличивает fmtbeg, чтобы он указывал на символ сразу после спецификатора преобразования, и продолжает цикл.str (то есть std::isspace(*fmtbeg, str.getloc()) == true), функция продолжает увеличивать fmtbeg, пока он не станет равен fmtend или не укажет на непробельный символ.++fmtbeg, ++beg; и продолжает цикл. В противном случае она устанавливает failbit в err.[beg, end) и соответствующим образом обновляет структуру std::tm, на которую указывает t.err, выполняя err = std::ios_base::goodbit. Затем читает из входной последовательности [beg, end) символы, ожидаемые спецификатором формата std::time_get, сформированным объединением '%', modifier (если он не равен '\0') и format. Если символы не образуют допустимый спецификатор преобразования, устанавливает failbit в err. Если после чтения символа достигнут конец входного потока, устанавливает eofbit в err. Если входная строка успешно разобрана, обновляет соответствующие поля *t. Для сложных спецификаторов преобразования, таких как '%x' или '%c', а также директив, использующих модификаторы 'E' и 'O', функция может не суметь определить некоторые значения для записи в *t. В этом случае она устанавливает eofbit в err и оставляет эти поля в неопределённом состоянии. Параметры
| beg | - | итератор, обозначающий начало разбираемой последовательности |
| end | - | итератор, следующий за последним элементом разбираемой последовательности |
| str | - | объект потока, из которого функция при необходимости получает фасеты локали, например std::ctype для пропуска пробельных символов или std::collate для сравнения строк |
| err | - | объект флагов ошибок потока, который функция изменяет для указания ошибок |
| t | - | указатель на объект std::tm, в котором будет храниться результат вызова функции |
| fmtbeg | - | указатель на первый символ последовательности символов char_type, задающей формат преобразования (см. ниже) |
| fmtend | - | указатель на символ, следующий за последним символом последовательности символов char_type, задающей формат преобразования |
| format | - | символ, обозначающий спецификатор преобразования |
| modifier | - | необязательный модификатор, который может находиться между % и спецификатором преобразования |
Строка формата состоит из нуля или более спецификаторов преобразования, пробельных символов и обычных символов (кроме %). Каждый обычный символ должен соответствовать одному символу входного потока при сравнении без учёта регистра. Каждый пробельный символ соответствует произвольному количеству пробельных символов во входной строке. Каждая спецификация преобразования начинается с символа %, за которым может следовать модификатор E или O (игнорируется, если не поддерживается локаль), а затем символ, определяющий поведение спецификатора. Спецификаторы формата соответствуют функции POSIX strptime():
| Спецификатор преобразования | Описание | Записываемые поля |
|---|---|---|
% | соответствует литеральному символу %. Полная спецификация преобразования должна иметь вид %% | (нет) |
t | соответствует любому пробельному символу | (нет) |
n | соответствует любому пробельному символу | (нет) |
| Год | ||
Y | разбирает полный год как десятичное число из 4 цифр; начальные нули допустимы, но не обязательны |
tm_year |
EY | разбирает год в альтернативном представлении, например 平成23年 (23-й год эпохи Хэйсэй), который в локали ja_JP записывает 2011 в tm_year |
tm_year |
y | разбирает последние 2 цифры года как десятичное число. Диапазону [69,99] соответствуют значения от 1969 до 1999, диапазону [00,68] — значения от 2000 до 2068 |
tm_year |
Oy | разбирает последние 2 цифры года в альтернативной системе счисления, например 十一 разбирается как 11 в локали ja_JP |
tm_year |
Ey | разбирает год как смещение от альтернативного календарного периода локали %EC |
tm_year |
C | разбирает первые 2 цифры года как десятичное число (диапазон [00,99]) |
tm_year |
EC | разбирает название базового года (периода) в альтернативном представлении локали, например 平成 (эпоха Хэйсэй) в ja_JP |
tm_year |
| Месяц | ||
b | разбирает название месяца — полное или сокращённое, например Oct |
tm_mon |
h | синоним b |
tm_mon |
B | синоним b |
tm_mon |
m | разбирает месяц как десятичное число (диапазон [01,12]); начальные нули допустимы, но не обязательны |
tm_mon |
Om | разбирает месяц в альтернативной системе счисления, например 十二 разбирается как 12 в локали ja_JP |
tm_mon |
| Неделя | ||
U | разбирает неделю года как десятичное число (первый день недели — воскресенье) (диапазон [00,53]); начальные нули допустимы, но не обязательны |
tm_year, tm_wday, tm_yday |
OU | разбирает неделю года, как и %U, используя альтернативную систему счисления; например, 五十二 разбирается как 52 в локали ja_JP |
tm_year, tm_wday, tm_yday |
W | разбирает неделю года как десятичное число (первый день недели — понедельник) (диапазон [00,53]); начальные нули допустимы, но не обязательны |
tm_year, tm_wday, tm_yday |
OW | разбирает неделю года, как и %W, используя альтернативную систему счисления; например, 五十二 разбирается как 52 в локали ja_JP |
tm_year, tm_wday, tm_yday |
| День года/месяца | ||
j | разбирает день года как десятичное число (диапазон [001,366]); начальные нули допустимы, но не обязательны |
tm_yday |
d | разбирает день месяца как десятичное число (диапазон [01,31]); начальные нули допустимы, но не обязательны |
tm_mday |
Od | разбирает день месяца в альтернативной системе счисления, например 二十七 разбирается как 27 в локали ja_JP; начальные нули допустимы, но не обязательны |
tm_mday |
e | синоним d |
tm_mday |
Oe | синоним Od |
tm_mday |
| День недели | ||
a | разбирает название дня недели — полное или сокращённое, например Fri |
tm_wday |
A | синоним a |
tm_wday |
w | разбирает день недели как десятичное число, где воскресенье соответствует 0 (диапазон [0-6]) |
tm_wday |
Ow | разбирает день недели как десятичное число, где воскресенье соответствует 0, используя альтернативную систему счисления; например, 二 разбирается как 2 в локали ja_JP |
tm_wday |
| Час, минута, секунда | ||
H | разбирает час как десятичное число в 24-часовом формате (диапазон [00-23]); начальные нули допустимы, но не обязательны |
tm_hour |
OH | разбирает час в 24-часовом формате с использованием альтернативной системы счисления; например, 十八 разбирается как 18 в локали ja_JP |
tm_hour |
I | разбирает час как десятичное число в 12-часовом формате (диапазон [01,12]); начальные нули допустимы, но не обязательны |
tm_hour |
OI | разбирает час в 12-часовом формате с использованием альтернативной системы счисления; например, 六 читается как 06 в локали ja_JP |
tm_hour |
M | разбирает минуту как десятичное число (диапазон [00,59]); начальные нули допустимы, но не обязательны |
tm_min |
OM | разбирает минуту с использованием альтернативной системы счисления; например, 二十五 разбирается как 25 в локали ja_JP |
tm_min |
S | разбирает секунду как десятичное число (диапазон [00,60]); начальные нули допустимы, но не обязательны |
tm_sec |
OS | разбирает секунду с использованием альтернативной системы счисления; например, 二十四 разбирается как 24 в локали ja_JP |
tm_sec |
| Прочее | ||
c | разбирает строку даты и времени в стандартном формате локали, например Sun Oct 17 04:41:13 2010 (зависит от локали) | все |
Ec | разбирает строку даты и времени в альтернативном формате локали; например, в локали ja_JP ожидается 平成23年 (23-й год эпохи Хэйсэй) вместо 2011年 (2011 год) | все |
x | разбирает дату в стандартном представлении локали | все |
Ex | разбирает дату в альтернативном представлении локали; например, в локали ja_JP ожидается 平成23年 (23-й год эпохи Хэйсэй) вместо 2011年 (2011 год) | все |
X | разбирает время в стандартном представлении локали | все |
EX | разбирает время в альтернативном представлении локали | все |
D | эквивалентно "%m / %d / %y " |
tm_mon, tm_mday, tm_year |
r | разбирает время в стандартном для локали 12-часовом формате (в POSIX — "%I : %M : %S %p") |
tm_hour, tm_min, tm_sec |
R | эквивалентно "%H : %M" |
tm_hour, tm_min |
T | эквивалентно "%H : %M : %S" |
tm_hour, tm_min, tm_sec |
p | разбирает эквивалент обозначения a.m. или p.m. в локали |
tm_hour |
Примечание: в tm_isdst не производится запись; для использования с такими функциями, как mktime, это значение необходимо установить явно.
Возвращаемое значение
Итератор, указывающий на символ сразу после последнего успешно разобранного символа в [beg, end).
Примечания
Для сравнения без учёта регистра непробельных символов строки формата, не являющихся '%', обычно используется фасет std::collate локали, предоставленной через str, хотя это и не обязательно.
При возникновении ошибки разбора многие реализации этой функции оставляют *t полностью без изменений.
Не определено, обнуляют ли эти функции поля в *t, которые они не устанавливают напрямую: для переносимости программы должны инициализировать каждое поле нулём перед вызовом get().
Пример
#include <iomanip>
#include <iostream>
#include <locale>
#include <sstream>
int main()
{
std::istringstream ss("2026-März-12 23:45:56");
ss.imbue(std::locale("de_DE.utf8"));
auto& f = std::use_facet<std::time_get<char>>(ss.getloc());
std::tm t{};
std::string s = "%Y-%b-%d %H:%M:%S";
std::ios_base::iostate err = std::ios_base::goodbit;
auto ret = f.get({ss}, {}, ss, err, &t, &s[0], &s[0] + s.size());
ss.setstate(err);
std::istreambuf_iterator<char> last{};
if (ss)
{
std::cout << "Successfully parsed as " << std::put_time(&t, "%c") << '\n';
if (ret != last)
{
std::cout << "Remaining content: ";
std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
}
else
std::cout << "The input was fully consumed.";
}
else
{
std::cout << "Parse failed.\nUnparsed string: ";
std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
}
std::cout << '\n';
}
Вывод:
Successfully parsed as Sun Mar 12 23:45:56 2026 The input was fully consumed.
См. также
|
(C++11) | разбирает значение даты/времени в указанном формате (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/time_get/get