C ++는 streamoff
형식을 사용하여 (파일) 스트림 내의 오프셋을 나타내며 [stream.types]에 다음과 같이 정의됩니다.
using streamoff = implementation-defined ;
type streamoff는 운영 체제에 가능한 최대 파일 크기를 나타내기에 충분한 크기의 서명 된 기본 정수 유형 중 하나와 동의어입니다. 287)
287) 일반적으로 길다.
이것은 long
32 비트 너비 의을 사용하는 것과는 반대로 큰 파일 내에서 탐색 할 수 있기 때문에 의미 가 있습니다.
[filebuf.virtuals]는 basic_filebuf
파일 내에서 찾는 기능을 다음과 같이 정의 합니다.
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_type
는 streamoff
[iostreams.limits.pos]를 참조하십시오. 그러나 표준은 함수의 효과를 설명하기 위해 계속됩니다. 나는 마지막 문장에 짜증이 나서 다음을 호출해야합니다 fseek
.
효과 :
width
표시 하자a_codecvt.encoding()
. 경우is_open() == false
, 또는off != 0 && width <= 0
, 그 위치 결정 작업이 실패. 그렇지 않은 경우way != basic_ios::cur
또는 또는off != 0
마지막 작업이 출력 된 경우 출력 시퀀스를 업데이트하고 언 시프트 시퀀스를 작성하십시오. 다음으로 새로운 위치를 찾으십시오 : ifwidth > 0
, callfseek(file, width * off, whence)
, 그렇지 않으면 callfseek(file, 0, whence)
.
fseek
long
매개 변수를 승인합니다 . 경우 off_type
와 streamoff
같이 정의된다 long long
(표준에 의해 제안),이에 다운 변환으로 이어질 수 long
호출 할 때 fseek(file, width * off, whence)
(버그를 진단 할 가능성이 하드로 이어지는). 이것은 처음에 streamoff
유형 을 소개하는 전체 이론적 근거에 의문을 제기합니다 .
이것이 표준에 의도적이거나 결함입니까?
seekoff
반드시 사용 fseek
되는 것처럼 보이지 않습니다 . 오히려 (아마도 친숙한) 행동은 fseek
무엇 seekoff
을하고 있는지 설명하는 데 사용됩니다 .
fseek
이 동일한 효과를 가진 무언가를하는 한 실제로 호출 할 필요가 없다는 것을 의미하는 것으로 합리적으로 해석 될 수 있음에 동의합니다 . 그러나 fseek
오프셋이 작 LONG_MIN
거나 크지 LONG_MAX
않은 경우 효과가 없으므로 적어도 streamoff
보다 넓은 구현에서는 설명이 불완전 long
합니다.