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,
const char_type* fmtbeg, const char_type* fmtend ) const;
| (1) | (с 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;
| (2) | (с C++11) |
[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'. Если строка формата неоднозначна или заканчивается слишком рано, чтобы определить спецификатор преобразования после '%', устанавливается eofbit в err и цикл завершается. Если после вызова 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 | - | необязательный модификатор, который может находиться между % и спецификатором преобразования |
Return value
Итератор, указывающий на символ, следующий за последним успешно разобранным символом в [beg, end).
Notes
Для сравнения регистронезависимых не-пробельных не-'%' символов в строке формата, std::collate-аспект локали, предоставляемой str, обычно, но не обязательно, используется.
В случае ошибки разбора многие реализации этой функции оставляют *t полностью нетронутым.
Не определено, обнуляются ли поля в *t, которые они не устанавливают напрямую: программы, совместимые со стандартом, должны инициализировать каждое поле нулем перед вызовом get().
Example
#include <iomanip>
#include <iostream>
#include <locale>
#include <sstream>
int main()
{
std::istringstream ss("2011-Februar-18 23:12:34");
ss.imbue(std::locale("de_DE.utf8"));
auto& f = std::use_facet<std::time_get<char>>(std::locale("de_DE.utf8"));
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");
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. Unparsed string: ";
std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
}
std::cout << '\n';
}Вывод:
Successfully parsed, as Sun Feb 18 23:12:34 2011 The input was fully consumed
See also
|
(C++11) | парсит значение даты/времени заданного формата (функция-шаблон) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/locale/time_get/get