C ++ tellg()返回类型

时间:2014-04-10 18:57:17

标签: c++

我正在阅读一个大型二进制文件,我想将当前位置与unsigned long long int进行比较。但是,根据C ++文档,我不清楚是否:

  1. tellg()
  2. 的返回类型是什么
  3. 如何将tellg()与unsigned long long int进行比较?
  4. tellg()的返回类型是否有可能小于unsigned long long int的最大值(来自numeric_limits)?
  5. 任何答案或建议都将不胜感激。

2 个答案:

答案 0 :(得分:6)

:tellg()的返回类型是什么?

A istream::tellg()的返回类型为streampos。查看std::istream::tellg

Q 如何将tellg()与unsigned long long int进行比较?

A tellg()的返回值是整数类型。因此,您可以使用常用运算符来比较两个int。但是,您不应该这样做以从中得出任何结论。标准声称支持的唯一操作是:

  

可以将此类型的两个对象与运算符==和!=进行比较。它们也可以减去,产生一个streamoff类型的值。

查看std::streampos

Q tellg()的返回类型是否有可能小于unsigned long long int的最大值(来自numeric_limits)?

A 该标准没有声明支持或反驳它。在一个平台上可能是真的,而另一个平台则是假的。

其他信息

比较streampos,支持和不支持的比较操作示例

ifstream if(myinputfile);
// Do stuff.
streampos pos1 = if.tellg();
// Do more stuff
streampos pos2 = if.tellg();

if ( pos1 == pos2 ) // Supported
{
   // Do some more stuff.
}

if ( pos1 != pos2 ) // Supported
{
   // Do some more stuff.
}

if ( pos1 != pos2 ) // Supported
{
   // Do some more stuff.
}

if ( pos1 == 0 ) // supported
{
   // Do some more stuff.
}

if ( pos1 != 0) // supported
{
   // Do some more stuff.
}

if ( pos1 <= pos2 ) // NOT supported
{
   // Do some more stuff.
}


int k = 1200;
if ( k == pos1 ) // NOT supported
{
}

答案 1 :(得分:0)

R Sahu在回答问题上做得很好,但是当将.tellg()的结果存储在int中时,我遇到了很多麻烦,并做了一些额外的调查。

TL; DR:使用std::streamoff(读作“流偏移量”)作为整数类型来存储tellg()的结果。

通过浏览std::basic_ifstream

pos_type tellg();

其中pos_typeTraits模板参数定义,而模板参数又由实现定义。对于std :: ifstream,特征是char类型的std::char_traits,导致到std::fpos。在这里,我们看到:

  

fpos类型的每个对象都在流中保留字节位置(通常作为std :: streamoff类型的私有成员)和当前移位状态,即State类型的值(通常为std: :mbstate_t)。

(由我自己完成)

因此,为避免溢出,可以安全地将tellg()的结果强制转换为std::streamoff的类型。此外,检查std::streamoff上是否显示

  

std :: streamoff类型是一个带符号的整数类型,其大小足以表示操作系统支持的最大可能文件大小。通常,这是 long long 的typedef。


由于确切的类型由您的系统定义,因此进行快速测试可能是一个好主意。这是我机器上的结果:

std::cout << "long long:" std::is_same<std::ifstream::off_type, long long>::value << std::endl;
std::cout << "long:" std::is_same<std::ifstream::off_type, long>::value << std::endl;

// Outputs
// long long:0
// long:1