std::basic_filebuf<CharT,Traits>:: seekoff
|
protected
:
virtual
pos_type seekoff
(
off_type off,
|
||
가능한 경우, 파일 포인터를 파일의 시작, 끝 또는 현재 위치로부터 정확히 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 | - |
상대 오프셋을 적용할 기준 위치를 정의합니다. 다음 상수 중 하나일 수 있습니다:
|
||||||||
| which | - |
입력 및/또는 출력 시퀀스 중 어떤 것을 영향을 줄지 정의합니다. 다음 상수들 중 하나 또는 조합일 수 있습니다:
|
반환값
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 멤버 함수) |
|
파일 위치 표시자를 파일의 특정 위치로 이동시킴
(함수) |