用C ++复制流

时间:2015-06-30 08:12:59

标签: c++ stream

以下程序打印0。

#include <ostream>
#include <string>
#include <sstream>
#include <iostream>

int main()
{
  std::string subjectString("subject");
  std::ostream tempStream(NULL);
  tempStream << subjectString;
  std::ostream& updatedStream = tempStream;
  std::stringstream ss;
  ss << updatedStream;
  std::cout << ss.str() << std::endl;
  return 0;
}

为什么?

修改

根据Niall的说法,我试过了:

#include <ostream>
#include <string>
#include <sstream>
#include <iostream>

int main()
{
  std::string subjectString("subject");
  std::stringbuf buffer;
  std::ostream tempStream(&buffer);

  buffer.sputn(subjectString.c_str(), subjectString.size());

  std::stringstream ss;
  ss << tempStream;
  std::cout << ss.str() << std::endl;
  return 0;
}

即便打印地址也是如此。不是实际的字符串。

2 个答案:

答案 0 :(得分:3)

std::ostream的构造需要一个缓冲区(不是NULL)。

此外,basic_stream个对象不可复制;

  

basic_ostream( const basic_ostream& rhs ) = delete;

参考;

http://en.cppreference.com/w/cpp/io/basic_ostream/basic_ostream

尝试更像这样的东西;

// ...
std::stringbuf buffer;
std::ostream tempStream(&buffer);
// ...

将缓冲区与流关联。

继续进行一些讨论和编辑;

一般情况下,我不会直接操作缓冲区,而是应该使用流而不是tempStream.write(...)。确切的细节超出了直接的问题/问题;是缓冲区和流内容流入该流的第一个流的初始化。如果你想要对代码做的只是检查数据是否在缓冲区中,那么你可以使用tempStream.rdbuf()->sgetn(...)

您已经提到这是一个更大问题的一部分。

在这里的一些评论和original problem的背景下;这可能是需要直接操作缓冲区的情况(与流的方式大致相同)。您的实施需要经过充分测试,因为这不是通常的&#34;使用流的方式,但它可以工作; .rdbuf()是您可以访问底层缓冲区的方式。我没有一个确切的片段(也许是另一个问题),但你可以清除缓冲区&#34;通过重置put和get区域的位置是相同的(参见缓冲区的定位,放置和获取区域功能 - std::ostream::seekp被提及用于处理此问题)。我认为stringstream的标准库实现也可以提供一些有用的提示。

答案 1 :(得分:2)

因为tempStream没有可以保存任何内容的流。

ss.str()返回NULL(0)。