Namespaces
Variants

std::strstreambuf:: seekoff

From cppreference.net
protected :

virtual pos_type seekoff ( off_type off,
ios_base :: seekdir way,

ios_base :: openmode which = ios_base :: in | ios_base :: out ) ;
(C++98에서 사용 중단됨)
(C++26에서 제거됨)

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

  • 만약 which ios_base :: in 를 포함하고 이 버퍼가 읽기용으로 열려 있다면, 아래에 설명된 대로 읽기 포인터 std::basic_streambuf::gptr 를 get 영역 내에서 재위치합니다.
  • 만약 which ios_base :: out 를 포함하고 이 버퍼가 쓰기용으로 열려 있다면, 아래에 설명된 대로 쓰기 포인터 std::basic_streambuf::pptr 를 put 영역 내에서 재위치합니다.
  • 만약 which ios_base :: in ios_base::out 모두를 포함하고 버퍼가 읽기와 쓰기 모두에 열려 있으며, way ios_base :: beg 또는 ios_base :: end 중 하나라면, 아래에 설명된 대로 읽기와 쓰기 포인터 모두를 재위치합니다.
  • 그렇지 않으면 이 함수는 실패합니다.

포인터( gptr 또는 pptr 또는 둘 다)가 재배치되는 경우, 다음과 같이 수행됩니다:

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

목차

매개변수

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

반환값

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

예제

#include <iostream>
#include <strstream>
int main()
{
    char a[] = "123";
    std::strstream ss(a, sizeof a); // 입출력
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    // 두 포인터의 절대 위치 지정
    ss.rdbuf()->pubseekoff(1, std::ios_base::beg); // 둘 다 앞으로 이동
    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 << "put 위치에 'a' 기록, 버퍼는 현재: '";
    std::cout.write(a, sizeof a);
    std::cout << "'\n";
    char ch;
    ss >> ch;
    std::cout << "get 위치에서 읽기 결과 '" << ch << "'\n";
}

출력:

put pos = 0 get pos = 0
put pos = 1 get pos = 1
현재 위치에서 두 포인터 이동 실패
put pos = 1 get pos = 1
put pos = 2 get pos = 1
put 위치에 'a' 기록, 버퍼는 현재: '12a'
get 위치에서 읽기 결과 '2'

결함 보고서

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

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

참고 항목

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