如何清除 std::ostringstream 实例以便可以重用? [复制]
Posted
技术标签:
【中文标题】如何清除 std::ostringstream 实例以便可以重用? [复制]【英文标题】:How do you clear a std::ostringstream instance so it can be reused? [duplicate] 【发布时间】:2012-07-12 19:13:28 【问题描述】:可能重复:How to reuse an ostringstream?
我一直在使用std::ostringstream
将float
和int
值转换为字符串,但无论如何我都找不到重用实例。为了说明我的意思,以下是我尝试用来清除流的方法
#include <iostream>
#include <sstream>
using namespace std;
int main()
ostringstream stream;
stream << "Test";
cout << stream.str() << endl;
stream.flush();
stream << "----";
cout << stream.str() << endl;
stream.clear();
stream << "****";
cout << stream.str() << endl;
return 0;
生成输出
Test
Test----
Test----****
这给了我一个问题,因为我必须创建许多 ostringstream
的实例,这很浪费。显然clear()
和flush()
没有做我需要做的事情,所以有没有办法做到这一点?我检查了http://www.cplusplus.com/reference/iostream/ostringstream/ 的文档,但那里似乎没有任何东西可以满足我的需求。有没有办法重置或清除流??
【问题讨论】:
【参考方案1】:使用stream.str("");
使底层字符串为空。更好的是,不要重用对象。在 C++ 中,哲学是在需要时创建对象并在完成时将其丢弃:
std::ostringstream oss;
oss << 10;
std::cout << oss.str();
std::ostringstream oss;
oss << 20.5;
std::cout << oss.str();
或者更好:
std::cout << static_cast<std::ostringstream&>(std::ostringstream() << 10).str();
【讨论】:
+1:正要说同样的话。虽然做stream.str("");
对我来说总是感觉像个黑客。
基本同意您的帖子,除了以开头的部分或更好: 和后面的其余部分。你不可能认为那是更好,对吗?!
@HappyGreenKidNaps:这只是一个例子。当然你可以写std::cout << 10
并完成它。如果我需要一个字符串,我想我会说std::to_string(10)
。
不存在“C++ 中的哲学,即在需要时创建对象并在完成时处理”这样的东西,而且从来没有。使用 str("") 调用是“重置”字符串流的完美方式。使用 static_cast 是您的提示,通常预测它永远不会在应用程序代码中使用,这是一种反 C++ 哲学的东西。【参考方案2】:
clear()
只清除错误标志。这是一个常见的错误。你想调用str()
,并传递一个空字符串来清除缓冲区:
stream.str("");
会做你想做的。
【讨论】:
以上是关于如何清除 std::ostringstream 实例以便可以重用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
std::ostringstream 转std::string
C++ std::ostringstream 是什么 怎么用