有没有办法使用“ostream”来写一个现有的std :: string实例

时间:2009-04-14 08:21:57

标签: c++

我知道所有类型的ostream都拥有自己的内部缓冲区。 我必须知道是否有某种ostream接受一个实例std :: string并在该实例上写入。

(我想避免冗余副本)

注意:我的问题是关于标准库,不提供其他可以做到这一点的库,我知道它们存在。 :)

修改:请求更具体...以下是我想要的内容,请考虑以下代码:

std::string str = "bla bla bla ";
std::ospecialstream o(str);
o << 34 << " bla bla";
std::cout << str; //console output : "bla bla bla 34 bla bla"

我想要ospecialstream,它不会将str内容复制到某个内部缓冲区,而是写入str的同一个实例。

编辑#2 出于性能原因我需要它,ostringstream在使用字符串创建时会生成memcopy,并且在检索内容时也会生成memcpy。

4 个答案:

答案 0 :(得分:3)

std::ostringstream sstream标题的一部分。

这个怎么样:

void appendStuff(string& in) {
   ostringstream os;
   os << 34 << " bla bla";
   in += os.str();
}

答案 1 :(得分:2)

如果你问你可以改变ostreams的缓冲,那么答案是肯定的。但是,根据您实际需要缓冲区的操作,这不是一项特别简单的任务。您需要查阅Langer & Kreft等书籍以获取更多信息。

L&amp; K有一个如何实现无缓冲输出流的示例 - 它从本书的第229页开始。这里重现太长了,但基本上你需要重新定义派生的streambuf类的overflow()方法。

请注意,该图书不在线提供,但源代码显然是 - 请参阅此page了解详细信息。

答案 2 :(得分:1)

简答:没有

答案很长:是的,但这需要编写您自己的streambuf课程,然后使用rdbuf进行设置。此外,现在已弃用的strstream几乎可以执行您想要的操作,并且可能仍在您的编译器库中。

答案 3 :(得分:1)

#include <iostream>
#include <string>

class intostring : public std::basic_streambuf<char> {
  std::string &str;
public:
  intostring(std::string &pstr):str(pstr) {}
  virtual std::streamsize xsputn(const char *const p, const std::streamsize n) {
    str.append(p, n);  
  }
};

int main() {
  std::string s("Original string: ");

  intostring newbuf(s);

  std::streambuf *oldbuf = std::cout.rdbuf(&newbuf);
  std::cout << "Should go to string" << std::endl;
  std::cout.rdbuf(oldbuf);  

  std::cout << "Should go to console again ... and here's the string: '" 
            << s << "'" << std::endl;
}

输出:

应该再次进入控制台...这里是字符串:'原始字符串:应该转到字符串'