C ++:字符串流提供什么好处?

时间:2010-02-25 14:39:10

标签: c++ string stringstream

有没有人能告诉我一些关于在c ++中使用字符串流的实际例子,即使用流插入和流提取操作符输入和输出到字符串流?

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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的所有可扩展性带到了使用字符缓冲区(ostreams可扩展性和语言环境支持,缓冲区内存管理被隐藏等等)。

我见过的另一个例子是gsoap库中的错误报告,使用依赖注入:soap_stream_fault需要一个ostream&amp;用于报告错误消息的参数。

如果你想要,你可以传递它std :: cerr,std :: cout或std :: ostringstream实现(我使用它与std :: ostringstream实现)。

答案 2 :(得分:2)

如果使用gcc 4.3.1,除了优点之外还有one point to carefully consider。我没有检查以前版本的gcc。

答案 3 :(得分: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);
}