istringstream,ostringstream和stringstream有什么区别? /为什么不在每种情况下使用stringstream?

时间:2010-07-20 16:20:01

标签: c++ string stringstream ostringstream istringstream

我何时会使用std::istringstreamstd::ostringstreamstd::stringstream,为什么我不应该在每个场景中使用std::stringstream(是否存在任何运行时性能问题?)。

最后,这有什么不好(而不是使用流):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";

8 个答案:

答案 0 :(得分:99)

就个人而言,我发现我很少想要在同一个字符串流中执行流式传输。

通常我想要从字符串初始化一个流然后解析它;或者将内容流式传输到字符串流,然后提取结果并存储它。

如果您要在同一个流中进行流式传输,则必须非常小心流状态和流位置。

使用'just'istringstreamostringstream可以更好地表达您的意图,并为您提供一些错误检查,例如意外使用<< vs >>

可能会有一些性能提升,但我不会先考虑它。

你所写的内容没有错。如果你发现它表现不佳,那么你可以描述其他方法,否则坚持最清楚的方法。就个人而言,我只想去:

std::string stHehe( "Hello stackoverflow.com!" );

答案 1 :(得分:19)

stringstream稍微大些,性能可能略低 - 多重继承可能需要调整vtable指针。主要区别在于(至少在理论上)更好地表达您的意图,并防止您意外地使用>>您想要的<<(反之亦然)。 OTOH,差异足够小,特别是对于快速的演示代码等,我很懒,只需使用stringstream。我不记得上次当我打算<<时我意外地使用了>>,所以对我来说,安全性似乎主要是理论上的(特别是因为如果你 make这样的错误,它几乎总是真的几乎立即显而易见。)

只要它使用一个字符串就没有错,只要它能完成你想要的东西。如果你只是将字符串放在一起,它很容易并且工作正常。如果你想格式化其他类型的数据,stringstream将支持这种格式,而字符串通常不支持。

答案 2 :(得分:14)

在大多数情况下,您不会发现自己需要在同一个字符串流上同时输入和输出,因此明确使用std::ostringstreamstd::istringstream可以明确您的意图。它还可以防止您意外键入错误的操作符(<< vs >>)。

当您需要在同一个流上执行这两个操作时,您显然会使用通用版本。

性能问题在这里是您最不关心的问题,清晰度是主要优势。

最后使用字符串append没有任何问题,因为你必须构造纯字符串。你不能用它来组合像perl这样的语言中的数字。

答案 3 :(得分:4)

istringstream用于输入,ostringstream用于输出。 stringstream是输入和输出。 你几乎可以在任何地方使用stringstream。 但是,如果您将对象提供给其他用户,并且它使用运算符&gt;&gt;而你在那里等待一个只写对象,你就不会高兴; - )

PS: 没什么不好的,只是性能问题。

答案 4 :(得分:2)

回答你的第三个问题:不,这是完全合理的。使用流的优点是您可以输入任何已定义operator<<的值,而您只能将字符串(C ++或C)添加到std::string

答案 5 :(得分:1)

大概只有插入或仅提取适合您的操作时,您可以使用“i”或“o”前缀版本中的一个来排除不需要的操作。

如果这不重要,那么您可以使用i / o版本。

您展示的字符串连接完全有效。尽管使用stringstream连接是可能的,但这不是stringstreams最有用的功能,它能够插入和提取POD和抽象数据类型。

答案 6 :(得分:0)

如果只需要读取文件,为什么要打开文件进行读/写访问?例如?

如果需要从同一个文件读取多个进程怎么办?

答案 7 :(得分:0)

std :: ostringstream :: str()创建流内容的副本,这在某些情况下会使内存使用量增加一倍。您可以改用std :: stringstream及其rdbuf()函数来避免这种情况。

此处有更多详细信息:how to write ostringstream directly to cout