【问题标题】:Can someone explain to me briefly what is std::streampos?有人可以简单地向我解释一下什么是 std::streampos 吗?
【发布时间】:2021-06-11 17:46:40
【问题描述】:

你能告诉我一些std::streampos 的例子吗? 我不确定它的用途,也不知道如何使用它。

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

std::streampos pos = ss.tellg();

其中ssstd::stringstream

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

【问题讨论】:

    标签: c++ stringstream


    【解决方案1】:

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

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

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

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

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

    std::stringstream::pos_type pos = ss.tellg();
    

    或者直接使用auto,这样你就不用担心了:

    auto pos = some_stream.tellg();
    

    【讨论】:

    • 那么,你说如果我只是为我写一个小程序,只是为了练习,我用int可以吗?
    • @vanderwaal 如果您只关心代码运行一次,那么只要它编译并执行您想要的操作,您就可以执行。但即便如此,养成默认编写可移植代码的习惯是件好事。 auto 让你可以轻松地做正确的事情,同时仍然很懒惰,所以你真的没有太多借口。
    • Documentation if you wish to go deeper. 如果您认为文档很复杂,那您是对的。它是。更有理由使用 auto 并让系统处理任何可能在您面前爆炸的琐碎细节,例如在 int 为 32 位的系统上获取大于 2 GB 的文件中的流位置。
    • 注意std::streampos不是整数类型;它定义了到整数类型的转换,但它包含多字节流状态信息(在某些字符编码中进行文本 I/O 时是必需的)。因此,转换为 int 不仅会导致超过 2 GB 的问题,它会丢弃如果您需要在后续 seekg 上恢复流的精确状态可能需要的信息(例如省略状态可能意味着您处于 UTF-8 字符的中间,没有有关先前字节的信息,因此无法读取您所在的字符。
    猜你喜欢
    • 2011-01-18
    • 2014-12-06
    • 2014-04-20
    • 2011-04-24
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多