正在复制C++中的流

Copying streams in C++

本文关键字:C++ 复制      更新时间:2023-10-16

以下程序打印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;
}

为什么?

编辑

根据尼尔的建议,我尝试了:

#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;
}

甚至这个也会打印地址。不是实际的字符串。

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(...)

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

在本文的一些评论的背景下,提出了原有的问题;这可能是需要直接操作缓冲区的情况(与流的操作方式大致相同)。您的实现需要经过良好的测试,因为这不是处理流的"常见"方式,但它可以工作;.rdbuf()是访问底层缓冲区的方式。我没有一个确切的片段(也许这是另一个问题),但你可以通过重置put和get区域的位置来"清除缓冲区",使其相同(请参阅缓冲区的定位、put和get面积函数-std::ostream::seekp被提到用于处理此问题)。我认为stringstream的标准库实现也可以提供一些有用的提示。

因为tempStream没有可容纳任何内容的流。

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