2011-03-31 6 views
4

개체 :을 증분 streampos 내가 이런 식으로 뭔가를 할 노력하고있어

for (std::streampos Position = 0; Position < 123; Position++) 
{ 
    // Use Position to access something... 
} 

그러나 std::streamposoperator++가 과부하가되지 않는 것 같습니다.

다음과 같은 오류에 Position = (Position + 1) 결과를 사용하려고 :

ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second: 

이에 대한 해결 방법이 있습니까, 아니면 파일을위한 충분한 큰 것으로 long unsigned int에 의존해야합니까?

답변

4

스트림의 오프셋을 나타내는 std::streamoff을 사용해보십시오. 사전 및 사후 증가/감소 연산자를 모두 지원합니다. Maxpm의 의견에

The underlying type is implementation defined, but must be able to be consistently converted to both streamsize and fpos (thus, to streampos too)

편집 : 당신은 어디에 streamoff을 적용 할 수 있습니다 그것은 ios::beg 또는 인해 임의 streampos. ios::beg에 적용하면 정상적인 streampos처럼 동작합니다. streampos에 적용하면 streampos+streamoff이됩니다.

+0

스트림 오프셋과 스트림 위치의 차이점은 무엇입니까? – Maxpm

+0

streampos는 스트림의 위치입니다. 스트림 오프는 그러한 위치로부터의 오프셋입니다. :-) –

+0

@Bo : Woops가 Maxpm의 의견을 완전히 간과 해 주셔서 감사합니다. ;) – Xeo

3

사용 += :

for (std::streampos Position = 0; Position < 123; Position += 1) 

+

operator + 때문에 작동하지 않습니다 실제로 streampossteamoff하지 int 정의됩니다.

즉, 1streamoff (아마도 unsigned long의 typedef 임)으로 변환 될 수있는 두 개의 암시 적 변환이 존재 함을 의미합니다. 또는 streamposstreamoff으로 암시 적으로 변환되며 1이 추가됩니다.

2

std::streampos은 숫자 유형이 아니며 숫자 유형과의 변환 을 지원하지만 숫자 유형은 아닙니다. 위치에서 산술 연산을 수행하려면 std::streamoff을 사용해야하며 seek을 호출 할 때는 인수를 지정해야합니다.

또한 이진 모드로 열어두고 "C" 로케일을 사용하지 않는 한 파일 의 임의 위치를 ​​찾을 수 없음을 잊지 마십시오.

관련 문제