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,
|
(1) | |
|
protected
:
virtual
iter_type do_get_weekday
(
iter_type beg, iter_type end,
std::
ios_base
&
str,
|
(2) | |
do_get_weekday
самого производного класса.
[
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 << "Разбор дня недели из '" << s << "' в локали " << 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 << "Успешно разобрано, номер дня недели: " << t.tm_wday; if (ret != last) { std::cout << " Оставшееся содержимое: "; std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout)); } else std::cout << " ввод был полностью обработан"; } else { std::cout << "Разбор не удался. Необработанная строка: "; 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 << "Невозможно установить локаль: " << locale_name << "\n" "Исключение: " << 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", {"土曜日"}); }
Возможный вывод:
Разбор дня недели из 'Št' в локали lt_LT.utf8 Успешно разобрано, номер дня недели 6, входные данные полностью обработаны Разбор дня недели из 'Šeštadienis' в локали lt_LT.utf8 Успешно разобрано, номер дня недели 6, входные данные полностью обработаны Разбор дня недели из 'SATELLITE' в локали en_US.utf8 Успешно разобрано, номер дня недели 6 Оставшееся содержимое: ELLITE Разбор дня недели из '土曜日' в локали ja_JP.utf8 Успешно разобрано, номер дня недели 6, входные данные полностью обработаны
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 248 | C++98 |
eofbit
не устанавливался при достижении конечного итератора
|
устанавливает
eofbit
если корректное название дня недели не было прочитано
|
Смотрите также
|
(C++11)
|
парсирует значение даты/времени указанного формата
(шаблон функции) |