zoukankan      html  css  js  c++  java
  • ostream 和 ostringsteam 的区别

    What is the difference between ostream and ostringstream?

    Put succinctly: ostringstream provides a streambufostream requires the user to provide one.

    To understand the implications, it's necessary to understand a little how streams work (and unlike some other posters, I'm not sure that there's a good explination of this on the Web). The basic abstraction of ostream is formatting textual output. You give it an int or a double (or a user defined type—more on that later), and it convert it into a stream of characters, of type char. What it does with that stream depends on the streambuf which is attached to it; this is an example of the strategy pattern, where streambuf is an abstract base class of the strategy[1]. The standard provides two implementations of streambuffilebuf and stringbuf; in practice, in all but the most trivial applications, you'll probably have some that you implement yourself.

    When outputting, you always use ostream; it's the class over which the << operators are defined. You're formatting your data into a stream of characters, and you don't really care where the stream ends up.

    When creating an instance: if you create an ostream, you must provide it with a streambufyourself. More often, you'll create an ofstream or an ostringstream. These are both "convenience" classes, which derive from ostream, and provide a streambuf for it (filebuf and stringbuf, as it happens). Practically speaking, all they do is provide the necessary streambuf(which affects the constructor and the destructor, and not very much else); in the case of ofstream, there are also a few extra functions which forward to additional functions in the filebufinterface.

    It's usual (but by no means required) when you define your own streambuf to provide convenience overloads of ostream (and istream, if relevant), along the same lines as ofstream or ostringstream.

    By the same token, when creating an instance, it's usual to use one of the "convenience" derived classes, rather than to use ostream directly and provide your own streambuf.

    And if all of this seems complicated: the iostream classes use just about all of the facilities of C++ (virtual functions, templates and function overloading all play an important role). If you're just learning C++, don't worry too much about it: just use ofstream or ostringstream when you construct an instance, but pass around references to ostream. And as you learn about techniques like virtual functions, templates and operator overloading, return to the iostreams to understand the role they play in making code more flexible.


    [1] For various reasons, std::streambuf is not actually abstract. But the implementations of the virtual functions in it are useless; extraction always returns EOF, and insertion always fails.

    In essence :

    The ofstream class makes it possible to write data to files using stream operations and the ostringstream class makes it possible to write to strings.

  • 相关阅读:
    全球覆盖 哈希
    陌上花开 模板 三维偏序
    洛谷 P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
    熟练剖分(tree) 树形DP
    那一天她离我而去 二进制分组建图
    平凡的函数 线性筛积性函数
    wmz的数数(数状数组)
    跳一跳 概率与期望
    洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP
    SpringBoot手动事务参考链接
  • 原文地址:https://www.cnblogs.com/grainy/p/7248185.html
Copyright © 2011-2022 走看看