有人可以向我简要解释一下什么是 std::streampos 吗?

van*_*aal 1 c++ stringstream

你能给我看一些例子吗std::streampos?我不确定它的用途是什么,也不知道如何使用它。

我在github的一个项目中看到:

std::streampos pos = ss.tellg();
Run Code Online (Sandbox Code Playgroud)

哪里。ssstd::stringstream

int pos = ss.tellg()例如,在这种情况下我们为什么不使用, 呢?

小智 6

例如,在本例中,我们为什么不使用 int pos = ss.tellg() 呢?

因为std::streampos恰好是 . 返回的类型std::basic_stringstream<char, std::char_traits<char>, std::allocator<char>>::tellg()

也许在一台计算机上它可以干净地转换为int,但在另一台计算机上则不然。通过使用正确的类型,您的代码是平台无关的。

另请注意,这std::streampos是该特定类的方法返回的类型,而不是各处方法tellg()返回的类型。tellg()其他流很可能返回不同的类型而不是std::streampos,您应该考虑到这一点。

选择正确类型的实际最干净的方法pos是直接询问类型:“我应该使用什么来表示流中的位置?”:

std::stringstream::pos_type pos = ss.tellg();
Run Code Online (Sandbox Code Playgroud)

或者只是使用auto这样你就不必担心它:

auto pos = some_stream.tellg();
Run Code Online (Sandbox Code Playgroud)

  • [如果您想更深入,请参阅文档。](https://en.cppreference.com/w/cpp/io/fpos) 如果您认为文档很复杂,那么您是对的。这是。更有理由使用“auto”并让系统处理任何可能在您面前爆炸的琐碎细节,例如在“int”为 32 位的系统上获取大于 2 GB 的文件中的流位置。 (3认同)
  • 请注意,“std::streampos”*不是*整数类型;它定义了到整数类型的转换,但它*还*包含多字节流状态信息(在某些字符编码中执行文本 I/O 时必需的)。因此,转换为“int”不仅会导致超过 2 GB 的问题,如果您需要在后续“seekg”上恢复流的精确状态,它*还会*丢弃可能需要的信息(例如,省略状态可能意味着您被留在 UTF-8 字符的中间,没有有关先前字节的信息,因此无法读取您所在的字符)。 (3认同)