gpt4 book ai didi

c++ - 在 C++ 中复制流

转载 作者:行者123 更新时间:2023-11-30 01:13:51 28 4
gpt4 key购买 nike

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

即使这样也会打印一个地址。不是实际的字符串。

最佳答案

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 的上下文中;这可能是需要直接操作缓冲区的情况(与流的方式大致相同)。您的实现需要经过良好测试,因为这不是使用流的“通常”方式,但它可以工作; .rdbuf() 是您到达底层缓冲区的方式。我没有确切的片段(也许这是另一个问题),但是您可以通过将放置和获取区域的位置重置为相同来“清除缓冲区”(请参阅​​定位、放置和获取区域功能缓冲区的 - std::ostream::seekp 被提及用于处理此问题)。我认为 stringstream 的标准库实现也可以提供一些有用的提示。

关于c++ - 在 C++ 中复制流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31132959/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com