Istream seekg()偏移量和ios::end

Istream seekg() offsets and ios::end

本文关键字:ios end 偏移量 seekg Istream      更新时间:2023-10-16

当我输入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();

当我输入<包含"123456789"的文件

输出为10 0

现在,如果我这样做:

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

输出为2

为什么?

此代码只是意外地工作

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

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

不幸的是,seekg的一个重载的参数是一个整数,因此调用变成了cin.seekg(2)。虽然在技术上是有效的代码,但这绝对不是您想要的。

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

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

您不能依赖STDIN的可查找性。这是因为它可能来自多种来源,包括绝对找不到的管道。当您重定向文件时,它很可能起作用,因为STDIN与文件流绑定。我不知道你是否可以相信,但这是我的猜测。我甚至从未考虑过在STDIN上寻找。我总是认为它是一根管子,即使它不是。与STDOUT相同。我不会输出一些东西,然后尝试回溯并"覆盖"输出。如果你发现自己需要在标准流中寻找,你可能应该重新思考你的方法。