增加streampos对象

时间:2011-03-31 14:59:55

标签: c++ operator-overloading filestream

我正在尝试做这样的事情:

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

但是,std::streampos似乎没有operator++重载。

尝试使用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 个答案:

答案 0 :(得分:5)

尝试std::streamoff,表示流中的偏移量。它支持前后增量/减量运算符。

  

基础类型是实现定义的,但必须能够始终如一地转换为streamsize和fpos(因此,对于streampos也是

编辑至Maxpm的评论:您可以将streamoff应用于任何地方,无论是ios::beg还是仲裁streampos。将其应用于ios::beg,其行为类似于普通streampos。将其应用于streampos,您获得了streampos+streamoff

答案 1 :(得分:4)

使用+=

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

+不起作用,因为operator +streampos实际上定义了steamoff,而不是int

这意味着存在两个同样优秀的隐式转换:您的1可以转换为streamoff(可能是unsigned long的typedef)。或者streampos隐式转换为streamoff,然后添加了1

答案 2 :(得分:3)

std::streampos不是数字类型,但它支持转换 来往于数字类型。如果你想做算术的话 位置,您需要使用std::streamoff(并指定from 呼叫寻求时的论据。)

另外,不要忘记你不能在任意位置寻求 一个文件,除非它已经以二进制模式打开,并充满了“C” 区域设置。

答案 3 :(得分:0)

我在研究如何从std::streampos对象中减去时遇到了此链接: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=187599

建议的解决方案是使用定义的运算符重载operator+()operator-(),它们对我来说很好。

Position.operator+(increment_val); 
Position.operator-(decrement_val); // alternative

P.S。 最好使用operator+()operator-()来避免任何与符号更改有关的问题