Spec-Zone.ru › C++

std::time_get<CharT,InputIt>::get_weekday, std::time_get<CharT,InputIt>::do_get_weekday

Определено в заголовке <locale>
public:
iter_type get_weekday( 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_weekday( iter_type beg, iter_type end, std::ios_base& str,
                                  std::ios_base::iostate& err, std::tm* t ) const;
(2)
1) Общедоступный член-функция, вызывает защищенную виртуальную член-функцию do_get_weekday самого производного класса.
2) Читает последовательные символы из последовательности [beg, end) и анализирует имя дня недели (возможно, сокращенное), используя стандартный формат для дней недели в текущем языковом стандарте. Этот формат совпадает с форматом "%a" и используется функциями std::get_time, time_get::get и функцией POSIX strptime().

Если найдено сокращенное имя, за которым следуют символы, соответствующие полному имени, чтение продолжается до тех пор, пока не будут прочитаны все символы полного имени или не встретится недопустимый символ. В этом случае анализ завершается неудачей, даже если первые несколько символов являлись допустимым сокращением.

Проанализированный день недели сохраняется в поле std::tm t->tm_wday.

Если в процессе чтения достигнут конец итератора, прежде чем было прочитано действительное имя дня недели, функция устанавливает 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 <initializer_list>
#include <iostream>
#include <iterator>
#include <locale>
#include <sstream>
#include <string_view>
 
void try_get_wday(std::string_view s)
{
    std::cout << "Parsing the weekday out of '" << s
              << "' in the locale " << std::locale().name() << '\n';
    std::istringstream str{s.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_weekday({str}, {}, str, err, &t);
    str.setstate(err);
    std::istreambuf_iterator<char> last{};
 
    if (str)
    {
        std::cout << "Successfully parsed, weekday number is " << t.tm_wday;
 
        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';
}
 
void demo(std::string_view locale_name, std::initializer_list<std::string_view>&& data)
{
    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;
    }
 
    for (std::string_view const weekday : data)
        try_get_wday(weekday);
}
 
int main()
{
    demo("lt_LT.utf8", {"Št", "Šeštadienis"});
    demo("en_US.utf8", {"SATELLITE"});
    demo("ja_JP.utf8", {"土曜日"});
}

Возможный вывод:

Parsing the weekday out of 'Št' in the locale lt_LT.utf8
Successfully parsed, weekday number is 6 the input was fully consumed
Parsing the weekday out of 'Šeštadienis' in the locale lt_LT.utf8
Successfully parsed, weekday number is 6 the input was fully consumed
Parsing the weekday out of 'SATELLITE' in the locale en_US.utf8
Successfully parsed, weekday number is 6 Remaining content: ELLITE
Parsing the weekday out of '土曜日' in the locale ja_JP.utf8
Successfully parsed, weekday number is 6 the input was fully consumed

Отчеты об ошибках

Следующие отчеты об ошибках, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применено к Поведение при публикации Корректное поведение
LWG 248 C++98 eofbit не устанавливалось при достижении конца итератора устанавливает eofbit если действительное имя дня недели не было прочитано

См. также

get_time
(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_weekday

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API