Namespaces
Variants

std::basic_stringbuf<CharT,Traits,Allocator>:: 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 ) ;

가능한 경우 버퍼의 get 및/또는 put 영역의 시작, 끝 또는 현재 위치에서 정확히 off 문자에 해당하는 위치로 std::basic_streambuf::gptr 및/또는 std::basic_streambuf::pptr 을 재배치합니다.

만약 gptr 및/또는 pptr 이 재배치되는 경우, 다음과 같이 수행됩니다:

1) 새로운 포인터 오프셋 newoff off_type 타입으로 결정됩니다
a) 만약 dir == std:: ios_base :: beg 라면, newoff 는 0입니다
b) 만약 dir == std:: ios_base :: cur 라면, newoff 는 포인터의 현재 위치입니다 ( gptr ( ) - eback ( ) 또는 pptr ( ) - pbase ( ) )
c) 만약 dir == std:: ios_base :: end 라면, newoff 는 버퍼의 초기화된 전체 부분의 길이입니다( 오버-할당 이 사용되는 경우, 상위 워터마크 포인터에서 시작 포인터를 뺀 값)
2) 재배치될 포인터가 널 포인터이고 newoff 가 0이 아닌 값일 경우, 이 함수는 실패합니다.
3) 만약 newoff + off < 0 (재배치가 포인터를 버퍼의 시작 이전으로 이동시키는 경우) 또는 newoff + off 가 버퍼의 끝을 지나서 가리키는 경우(또는 오버-할당 이 사용되는 경우 버퍼의 마지막 초기화된 문자를 지나는 경우), 함수는 실패합니다.
4) 그렇지 않으면, 포인터는 다음과 같이 할당됩니다: gptr ( ) = eback ( ) + newoff + off 또는 pptr ( ) = pbase ( ) + newoff + off .

목차

매개변수

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

반환값

pos_type ( newoff ) 성공 시, pos_type ( off_type ( - 1 ) ) 실패 시 또는 pos_type 이 결과 스트림 위치를 표현할 수 없는 경우.

예제

#include <iostream>
#include <sstream>
int main()
{
    std::stringstream ss("123"); // 입출력
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    // 두 포인터의 절대 위치 지정
    ss.rdbuf()->pubseekoff(1, std::ios_base::beg); // 둘 다 1만큼 앞으로 이동
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    // 현재 위치에서 두 포인터를 1만큼 앞으로 이동 시도
    if (-1 == ss.rdbuf()->pubseekoff(1, std::ios_base::cur))
        std::cout << "현재 위치에서 두 포인터 이동 실패\n";
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    // 쓰기 포인터만 1만큼 앞으로 이동, 읽기 포인터는 이동하지 않음
    // ss.seekp(1, std::ios_base::cur); 로도 호출 가능
    ss.rdbuf()->pubseekoff(1, std::ios_base::cur, std::ios_base::out);
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    ss << 'a'; // put 위치에 쓰기
    std::cout << "'a'를 put 위치에 기록, 현재 버퍼: " << ss.str() << '\n';
    char ch;
    ss >> ch;
    std::cout << "get 위치에서 읽은 값: '" << ch << "'\n";
}

출력:

put pos = 0 get pos = 0
put pos = 1 get pos = 1
moving both pointers from current position failed
put pos = 1 get pos = 1
put pos = 2 get pos = 1
Wrote 'a' at put position, the buffer is now 12a
reading at get position gives '2'

결함 보고서

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

DR 적용 대상 게시된 동작 수정된 동작
LWG 55 C++98 seekoff 실패 시 정의되지 않은
잘못된 스트림 위치 반환
pos_type ( off_type ( - 1 ) )
실패 시 반환됨
LWG 375 C++98 std::ios_base 의 정적 상수 멤버들이
std::basic_ios 의 멤버로 잘못 지정됨
수정됨
LWG 432 C++98 seekoff newoff + off
가 마지막 초기화된 문자를 지나가는 경우에도 성공할 수 있음
seekoff
이 경우 실패함
LWG 453 C++98 null gptr ( ) 및/또는 null pptr ( )
를 새 오프셋 0으로 재위치할 때 항상 실패함
이 경우 성공할 수 있음
LWG 563 C++98 LWG 이슈 432 해결 후
끝 포인터를 사용해 newoff 를 계산할 수 없었음
(프로그램이 정밀하게 제어할 수 없기 때문)
대신 하이 워터마크
포인터 사용

참고 항목

seekoff ( ) 를 호출함
( std::basic_streambuf<CharT,Traits> 의 public 멤버 함수)
[virtual]
입력 시퀀스, 출력 시퀀스 또는 둘 모두에서 다음 포인터를 절대 주소 지정을 사용하여 재위치함
(가상 protected 멤버 함수)
[virtual]
상대 주소 지정을 사용하여 파일 위치를 재위치함
( std::basic_filebuf<CharT,Traits> 의 가상 protected 멤버 함수)
[virtual]
입력 시퀀스, 출력 시퀀스 또는 둘 모두에서 다음 포인터를 상대 주소 지정을 사용하여 재위치함
( std::strstreambuf 의 가상 protected 멤버 함수)