【问题标题】:What should I use instead of std::ostrstream?我应该使用什么来代替 std::ostrstream?
【发布时间】:2012-06-06 15:47:33
【问题描述】:

我喜欢使用std::ostrstream 来格式化文本,但不将其打印到标准输出,而是将其写入std::string(通过访问std::ostrstream::str() 成员)。显然,现在已弃用。那么,我应该如何将格式化的对象写入字符串,并且与写入流时一样方便?

【问题讨论】:

  • 过去 14 年它已被弃用,你去过哪里? :)
  • @JonathanWakely:好吧,假设我不久前才意识到这一点。显然我没有足够重视:)

标签: c++ stream deprecated


【解决方案1】:

您可以使用std::ostringstream。同样,您应该使用std::istringstream 而不是std::istrstream。您需要为这些类添加 <sstream> 标头。

您还可以看到 this question,这解释了为什么不推荐使用 strstream

【讨论】:

  • 我对不赞成票感到困惑!有没有人看到里面有问题?
  • 你得到了我的赞成票,但我猜反对票是因为你链接到 cplusplus.com,这很糟糕,而且充满了糟糕的风格和一些彻头彻尾的错误。
  • @JonathanWakely,我知道 cplusplus.com 很烂。我自己总是尽量避免它。你知道我可以加入的可靠网站吗?问题是在谷歌上搜索总是会首先显示该网站。再往下走,你会看到 MSDN(我什至不会考虑作为一个实例),然后你就离开了参考网站,进入了诸如 stackoverflow 之类的问答网站。
  • 我曾经使用 dinkumware 手册,但上次我检查它们已经消失了。
  • @JonathanWakely,你看到了吗?我们需要一个很好的在线参考,但我找不到任何参考。
【解决方案2】:

您应该使用std::stringstream。另请参阅boost::lexical_cast

std::stringstream 同时支持<<>>std::ostringstream 只支持<<std::istringstream 只支持>>。我经常发现同时使用这两个运算符很方便。

【讨论】:

  • 无论如何他“应该”?如果他只需要输入或只需要输出怎么办?在这种情况下,我建议不要使用过于笼统的解决方案。
【解决方案3】:

您也可以使用boost::format。然后您可以执行以下操作:

int a = 1;
std::string b("foo");
std::string s = boost::str(
    boost::format("some text, some vars=%1%, %2%, %1%") % a % b % a);

那么s 将包含"some text, some vars=1, foo, 1"

在我看来,这在某些情况下比使用运算符<< 更方便。

作为参考,我还包括format specification

【讨论】:

  • 你想停止使用 '%d' 和其他特定类型的东西,因为这会导致与 sprintf() 相同的问题。首选索引特定标识符“%1”。
  • @LokiAstari 谢谢!我不知道。我会相应地更新我的答案。但是,如果您只想显示带两位小数的浮点数怎么办?除了使用%.02f,还有其他方法吗?
【解决方案4】:

正如其他人已经说过的,std::ostringstream 是替代品。

它比std::ostrstream 更方便(也更安全),因为它会自动管理所有内存,因此您无需调用freeze(false) 来确保在您完成后释放内存。

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 2010-12-06
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多