Namespaces
Variants

std::time_get<CharT,InputIt>:: get_monthname, std::time_get<CharT,InputIt>:: do_get_monthname

From cppreference.net
Определено в заголовке <locale>
public :

iter_type get_monthname ( iter_type beg, iter_type end, std:: ios_base & str,

std:: ios_base :: iostate & err, std:: tm * t ) const ;
(1)
protected :

virtual iter_type do_get_monthname ( iter_type beg, iter_type end, std:: ios_base & str,

std:: ios_base :: iostate & err, std:: tm * t ) const ;
(2)
1) Открытая функция-член, вызывает защищённую виртуальную функцию-член do_get_monthname самого производного класса.
2) Считывает последовательные символы из последовательности [ 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)
парсирует значение даты/времени указанного формата
(шаблон функции)