我正在尝试做这样的事情:
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
足够大的文件?
答案 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-()
来避免任何与符号更改有关的问题