Istream seekg()偏移和ios :: end

时间:2012-07-30 03:09:28

标签: c++ stream

当我输入is.seekg(0)时,它会将我带到流的开头。但是,当我输入is.seekg(ios :: end)时,它会将我带到第二个字符。为什么会这样?我认为我对此的误解源于对流如何工作的基本缺乏理解。我认为当你提供常量ios :: end时,它会带你到那个流的末尾。但是,似乎它会让你向前移动一个角色。

  cin.seekg(0, ios::end);
  int length = cin.tellg();
  cout << length << endl;

  cin.seekg(0);

  cout << cin.tellg();

当我输入&lt;包含“123456789”的文件

输出为10 0

现在,如果我这样做:

  cin.seekg(ios::end);
  int length = cin.tellg();
  cout << length << endl;

输出为2

为什么?

3 个答案:

答案 0 :(得分:3)

此代码只是偶然使用

cin.seekg(ios::end);
int length = cin.tellg();
cout << length << endl; 

end来自enum seekdir {beg, cur, end};,因此ios::end恰好可以转换为值为2的整数。

令人遗憾的是,seekg的一个重载参数是一个整数,因此调用变为cin.seekg(2)。虽然技术上有效的代码,但这绝对不是你想要的。

答案 1 :(得分:2)

您正在将std::ios_base::seekdir类型的内容转换为类型std::istream::pos_type,并调用只需要一个参数的seekg版本。那个版本的seekg将指针移动到绝对位置,而不是相对位置。

ios::end是用于相对偏移的逻辑位置,而不是绝对位置。

答案 2 :(得分:1)

你不能依赖STDIN是可以寻找的。这是因为它可能来自许多来源,包括绝对不可寻找的管道。由于STDIN绑定到文件流,因此重定向文件时可能会有效。我不知道你是否可以依靠它,但这是我的猜测。我甚至都没想过要求STDIN。我一直认为它是一个管道,即使它不是。与STDOUT相同。我不会输出一些东西然后尝试回溯并'覆盖'那个输出。如果您发现自己需要在标准流中寻找,那么您应该重新考虑您的方法。