3

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

这是为什么?

4

3 回答 3

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). 虽然技术上有效的代码,但这绝对不是你想要的。

于 2012-07-30T09:15:19.330 回答
2

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

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

于 2012-07-30T03:26:53.467 回答
1

您不能依赖 STDIN 是可搜索的。这是因为它可以来自许多来源,包括绝对不可搜索的管道。当您重定向文件时它可能会起作用,因为 STDIN 已绑定到文件流。我不知道你是否可以依赖它,但这是我的猜测。我从来没有考虑过在 STDIN 上寻找。我一直认为它是一个管道,即使它不是。与标准输出相同。我不会输出任何东西,然后尝试回溯并“覆盖”该输出。如果您发现自己需要在标准流中寻找,您可能应该重新考虑您的方法。

于 2012-07-30T03:27:27.267 回答