C++:字符串流有啥好处?

Posted

技术标签:

【中文标题】C++:字符串流有啥好处?【英文标题】:C++: what benefits do string streams offer?C++:字符串流有什么好处? 【发布时间】:2010-02-25 14:39:09 【问题描述】:

谁能告诉我一些在 c++ 中使用字符串流的实际例子,即使用流插入和流提取运算符输入和输出到字符串流?

【问题讨论】:

你是说cin和cout?与 C 风格的 getc 和 printf 不同? @Vanessa: OP 大概意思是std::stringstream, (#include <sstream>) 【参考方案1】:

您可以使用字符串流将任何实现 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;

【讨论】:

请记住,此解决方案仅适用于具有特定类的基本类型和 operator&lt;&lt; 的重载版本。 @fogo:因为为类定义流式操作符比较普遍,所以这没什么大不了的。 @Martin York 实际上,考虑到答案中的 convert anything 评论,我只是考虑了一个适当的评论。【参考方案2】:

在创建消息时,我主要将它们用作内存缓冲区:

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

我看到的另一个例子是 gsoap 库中的错误报告,使用依赖注入:soap_stream_fault 采用 ostream& 参数来报告错误消息。

如果你愿意,你可以传递它 std::cerr、std::cout 或 std::ostringstream 实现(我将它与 std::ostringstream 实现一起使用)。

【讨论】:

【参考方案3】:

它们可以在任何可以使用普通流的地方使用。

因此,在您从文件中读取的情况下,您可能会从字符串流中读取。

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);

【讨论】:

【参考方案4】:

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

【讨论】:

这是特定实现 (gcc) 的限制。如果您点击链接到与问题相关的 bugzilla 错误,您还会注意到该错误已被标记为已解决不再使用互斥锁 那就太好了!我将编辑我的帖子以添加信息,这些信息仅与某些版本的 gcc 相关。

以上是关于C++:字符串流有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 字符串流

获取字符串流 C++ 的剩余部分

C++学习50 对字符串流的读写

如何使用 C++ 字符串流附加 int?

C++: I/O流详解——串流

sstream