谁能告诉我一些在 c++ 中使用字符串流的实际示例,即使用流插入和流提取运算符输入和输出到字符串流?
问问题
6347 次
4 回答
11
您可以使用字符串流将实现的任何内容转换operator <<
为字符串:
#include <sstream>
template<typename T>
std::string toString(const T& t)
{
std::ostringstream stream;
stream << t;
return stream.str();
}
甚至
template <typename U, typename T>
U convert(const T& t)
{
std::stringstream stream;
stream << t;
U u;
stream >> u;
return u;
}
于 2010-02-25T14:47:36.773 回答
3
在创建消息时,我主要将它们用作内存缓冲区:
if(someVector.size() > MAX_SIZE)
{
ostringstream buffer;
buffer << "Vector should not have " << someVector.size() << " eleements";
throw std::runtime_error(buffer.str());
}
或构造复杂的字符串:
std::string MyObject::GenerateDumpPath()
{
using namespace std;
std::ostringstream dumpPath;
// add the file name
dumpPath << "\\myobject."
<< setw(3) << setfill('0') << uniqueFileId
<< "." << boost::lexical_cast<std::string>(state)
<< "_" << ymd.year
<< "." << setw(2) << setfill('0') << ymd.month.as_number()
<< "." << ymd.day.as_number()
<< "_" << time.hours()
<< "." << time.minutes()
<< "." << time.seconds()
<< ".xml";
return dumpPath.str();
}
它很有用,因为它将std::stream
s 的所有可扩展性带到使用字符缓冲区(ostreams 可扩展性和语言环境支持,隐藏缓冲区内存管理等)。
我见过的另一个例子是 gsoap 库中的错误报告,使用依赖注入:soap_stream_fault采用 ostream& 参数来报告错误消息。
如果你愿意,你可以传递它 std::cerr、std::cout 或 std::ostringstream 实现(我将它与 std::ostringstream 实现一起使用)。
于 2010-02-25T15:53:18.123 回答
2
除了优点之外,如果您使用 gcc 4.3.1 ,还有一点需要仔细考虑。我没有检查以前版本的 gcc。
于 2010-02-25T14:52:41.457 回答
2
它们可以在任何可以使用普通流的地方使用。
因此,在您从文件中读取的情况下,您可能会从字符串流中读取。
void compile(std::istream& str)
{
CPlusPlusLexer lexer(str);
CPlusPlusParser parser(lexer);
BackEnd backend(parser);
backend.compile();
}
int main()
{
std::fstream file("Plop.cpp");
compile(file);
std::stringstream test("#include <iostream>\n int main() { std::cout << \"H World\n\";}");
compile(test);
}
于 2010-02-25T14:57:42.073 回答