Namespaces
Variants

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

From cppreference.net
헤더 파일에 정의됨 <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) Public 멤버 함수, 가장 파생된 클래스의 protected virtual 멤버 함수 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 ) 에서 마지막 문자 바로 다음을 가리키는 iterator.

참고 사항

이 함수는 일반적으로 대소문자를 구분하지 않습니다.

구문 분석 오류가 발생하면, 이 함수의 대부분 구현에서는 * 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 << "로케일 " << std::locale().name() << "에서 '" << s
              << "'의 요일을 파싱합니다\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", {"土曜日"});
}

가능한 출력:

로케일 lt_LT.utf8에서 'Št'의 요일 파싱
성공적으로 파싱됨, 요일 번호는 6 입력이 완전히 소비됨
로케일 lt_LT.utf8에서 'Šeštadienis'의 요일 파싱
성공적으로 파싱됨, 요일 번호는 6 입력이 완전히 소비됨
로케일 en_US.utf8에서 'SATELLITE'의 요일 파싱
성공적으로 파싱됨, 요일 번호는 6 남은 내용: ELLITE
로케일 ja_JP.utf8에서 '土曜日'의 요일 파싱
성공적으로 파싱됨, 요일 번호는 6 입력이 완전히 소비됨

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 248 C++98 eofbit 이 끝 반복자에 도달했을 때 설정되지 않음 유효한 요일 이름이 읽히지 않은 경우 eofbit 을 설정함

참고 항목

(C++11)
지정된 형식의 날짜/시간 값을 파싱함
(함수 템플릿)