正在复制C++中的流
Copying streams in C++
以下程序打印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)。
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 复制几乎为空的数组的最快方法
- 以下示例中如何避免代码复制?C++/库达
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 文件系统:复制功能的速度秘诀是什么
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 使lambda不可复制/不可移动