Namespaces
Variants

std::basic_filebuf<CharT,Traits>:: seekoff

From cppreference.net
protected :

virtual pos_type seekoff ( off_type off,
std:: ios_base :: seekdir dir,

std:: ios_base :: openmode which = std:: ios_base :: in | std:: ios_base :: out ) ;

가능한 경우, 파일 포인터를 파일의 시작, 끝 또는 현재 위치로부터 정확히 off 문자에 해당하는 위치로 재배치합니다( dir 값에 따라 다름).

연결된 파일이 열려 있지 않으면 ( is_open ( ) == false ), 즉시 실패합니다.

다중 바이트 문자 인코딩이 상태 의존적이거나( codecvt::encoding() - 1 를 반환하는 경우) 가변 길이( codecvt::encoding() 0 를 반환하는 경우)이고 오프셋 off 0 이 아닌 경우, 즉시 실패합니다: 이 함수는 off 문자에 해당하는 바이트 수를 결정할 수 없습니다.

만약 dir std::basic_ios::cur 가 아니거나 오프셋 off 0 이 아니며, 이 filebuf 객체에 대해 가장 최근에 수행된 연산이 출력(즉, put 버퍼가 비어 있지 않거나 가장 최근에 호출된 함수가 overflow() 인 경우)이라면, std :: codecvt :: unshift 를 호출하여 필요한 언시프트 시퀀스를 결정하고, 이를 overflow() 를 호출하여 파일에 기록합니다.

그런 다음 인수 dir 를 다음과 같이 int 타입의 whence 값으로 변환합니다:

dir 의 값 whence 의 값
std :: basic_ios :: beg SEEK_SET
std :: basic_ios :: end SEEK_END
std :: basic_ios :: cur SEEK_CUR

그런 다음, 문자 인코딩이 고정 너비인 경우( codecvt::encoding() 가 양수 width 를 반환하면), 파일 포인터를 마치 std:: fseek ( file, width * off, whence ) 처럼 이동시킵니다.

그렇지 않으면, 파일 포인터를 다음과 같이 이동시킵니다: std:: fseek ( file, 0 , whence ) .

기본 클래스 함수 시그니처에 필요한 openmode 인수는 일반적으로 무시됩니다, 왜냐하면 std::basic_filebuf 는 단 하나의 파일 위치만 유지하기 때문입니다.

목차

매개변수

off - 위치 지정자를 설정할 상대 위치
dir - 상대 오프셋을 적용할 기준 위치를 정의합니다. 다음 상수 중 하나일 수 있습니다:
Constant Explanation
beg 스트림의 시작
end 스트림의 끝
cur 스트림 위치 지정자의 현재 위치
which - 입력 및/또는 출력 시퀀스 중 어떤 것을 영향을 줄지 정의합니다. 다음 상수들 중 하나 또는 조합일 수 있습니다:
Constant Explanation
in 입력 시퀀스에 영향
out 출력 시퀀스에 영향

반환값

pos_type 타입의 새로 생성된 객체로, 결과 파일 위치를 저장하거나, 실패 시 pos_type ( off_type ( - 1 ) ) 를 반환합니다.

참고 사항

seekoff() std :: basic_streambuf :: pubseekoff 에 의해 호출되며, 이는 다시 std :: basic_istream :: seekg , std :: basic_ostream :: seekp , std :: basic_istream :: tellg , 그리고 std :: basic_ostream :: tellp 에 의해 호출됩니다.

예제

#include <fstream>
#include <iostream>
#include <locale>
template<typename CharT>
int get_encoding(const std::basic_istream<CharT>& stream)
{
    using Facet = std::codecvt<CharT, char, std::mbstate_t>;
    return std::use_facet<Facet>(stream.getloc()).encoding();
}
int main()
{
    // UTF-8로 4개 문자("zß水𝄋")를 담은 10바이트 파일 준비
    std::ofstream("text.txt") << "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
    // 변환 없는 인코딩으로 열기
    std::ifstream f1("text.txt");
    std::cout << "f1의 로캘 encoding() 반환값: "
              << get_encoding(f1) << '\n'
              << "pubseekoff(3, beg) 반환값: "
              << f1.rdbuf()->pubseekoff(3, std::ios_base::beg) << '\n'
              << "pubseekoff(0, end) 반환값: "
              << f1.rdbuf()->pubseekoff(0, std::ios_base::end) << '\n';
    // UTF-8로 열기
    std::wifstream f2("text.txt");
    f2.imbue(std::locale("en_US.UTF-8"));
    std::cout << "f2의 로캘 encoding() 반환값: "
              << get_encoding(f2) << '\n'
              << "pubseekoff(3, beg) 반환값: "
              << f2.rdbuf()->pubseekoff(3, std::ios_base::beg) << '\n'
              << "pubseekoff(0, end) 반환값: "
              << f2.rdbuf()->pubseekoff(0, std::ios_base::end) << '\n';
}

출력:

f1의 로캘 encoding() 반환값: 1
pubseekoff(3, beg) 반환값: 3
pubseekoff(0, end) 반환값: 10
f2의 로캘 encoding() 반환값: 0
pubseekoff(3, beg) 반환값: -1
pubseekoff(0, end) 반환값: 10

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 55 C++98 seekoff 실패 시 정의되지 않은
잘못된 스트림 위치를 반환함
pos_type ( off_type ( - 1 ) )
실패 시 반환됨

참고 항목

std::basic_streambuf<CharT,Traits> seekoff ( ) 를 호출함
( std::basic_streambuf<CharT,Traits> 의 public 멤버 함수)
[virtual]
절대 주소 지정을 사용하여 파일 위치를 재배치함
(virtual protected 멤버 함수)
파일 위치 표시자를 파일의 특정 위치로 이동시킴
(함수)