std::time_get<CharT,InputIt>:: get_monthname, std::time_get<CharT,InputIt>:: do_get_monthname
|
Определено в заголовке
<locale>
|
||
|
public
:
iter_type get_monthname
(
iter_type beg, iter_type end,
std::
ios_base
&
str,
|
(1) | |
|
protected
:
virtual
iter_type do_get_monthname
(
iter_type beg, iter_type end,
std::
ios_base
&
str,
|
(2) | |
do_get_monthname
самого производного класса.
[
beg
,
end
)
и анализирует название месяца (возможно сокращенное), используя формат по умолчанию для названий месяцев, ожидаемый данной локалью, который совпадает с форматом
"%b"
, используемым функциями
std::get_time
,
time_get::get
и POSIX-функцией
strptime()
.
Если он находит сокращённое имя, за которым следуют символы, допустимые для полного имени, он продолжает чтение до тех пор, пока не будут обработаны все символы полного имени или не будет найден символ, который не ожидается, в этом случае разбор завершается неудачей, даже если первые несколько символов были допустимым сокращением.
Распознанный месяц сохраняется в поле std::tm t - > tm_mon .
Если конечный итератор достигнут до того, как было прочитано корректное название месяца, функция устанавливает std::ios_base::eofbit в err . Если возникает ошибка парсинга, функция устанавливает std::ios_base::failbit в err .
Содержание |
Параметры
| beg | - | итератор, указывающий на начало последовательности для парсинга |
| end | - | итератор, указывающий на позицию за последним элементом последовательности для парсинга |
| str | - | объект потока, который эта функция использует для получения локалей при необходимости, например std::ctype для пропуска пробельных символов или std::collate для сравнения строк |
| err | - | объект флагов ошибок потока, который модифицируется этой функцией для указания ошибок |
| t | - | указатель на объект std::tm , который будет содержать результат вызова этой функции |
Возвращаемое значение
Итератор, указывающий на позицию после последнего символа в
[
beg
,
end
)
который был распознан как часть допустимого названия месяца.
Примечания
Эта функция обычно нечувствительна к регистру.
Если возникает ошибка синтаксического анализа, большинство реализаций этой функции оставляют * t неизменным.
Пример
#include <ctime> #include <iostream> #include <iterator> #include <locale> #include <sstream> #include <string_view> void try_get_mon(std::string_view locale_name, std::string_view source) { try { std::locale::global(std::locale(locale_name.data())); } catch (std::runtime_error const& ex) { std::cout << "Cannot setup locale: " << locale_name << "\n" "Exception: " << ex.what() << '\n'; return; } std::cout << "Parsing the month out of '" << source << "' in the locale " << std::locale().name() << '\n'; std::istringstream str{source.data()}; std::ios_base::iostate err = std::ios_base::goodbit; std::tm t; std::time_get<char> const& facet = std::use_facet<std::time_get<char>>(str.getloc()); std::istreambuf_iterator<char> ret = facet.get_monthname({str}, {}, str, err, &t); str.setstate(err); std::istreambuf_iterator<char> last{}; if (str) { std::cout << "Successfully parsed, month number is " << t.tm_mon; 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'; } int main() { try_get_mon("ja_JP.utf8", "2月"); try_get_mon("th_TH.utf8", "กุมภาพันธ์"); try_get_mon("el_GR.utf8", "Φεβ"); try_get_mon("el_GR.utf8", "Φεβρουάριος"); try_get_mon("en_US.utf8", "Febrile"); }
Возможный вывод:
Parsing the month out of '2月' in the locale ja_JP.utf8 Successfully parsed, month number is 1. The input was fully consumed Parsing the month out of 'กุมภาพันธ์' in the locale th_TH.utf8 Successfully parsed, month number is 1. The input was fully consumed Parsing the month out of 'Φεβ' in the locale el_GR.utf8 Successfully parsed, month number is 1. The input was fully consumed Parsing the month out of 'Φεβρουάριος' in the locale el_GR.utf8 Successfully parsed, month number is 1. The input was fully consumed Parsing the month out of 'Febrile' in the locale en_US.utf8 Parse failed. Unparsed string: ile
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 248 | C++98 |
eofbit
не устанавливался при достижении конечного итератора
|
устанавливает
eofbit
если корректное название месяца не было прочитано
|
Смотрите также
|
(C++11)
|
парсирует значение даты/времени указанного формата
(шаблон функции) |