gpt4 book ai didi

c++ - 获取 streambuf/stringbuf 数据的所有权

转载 作者:行者123 更新时间:2023-11-30 03:23:25 24 4
gpt4 key购买 nike

我想要一个用于写入自动调整大小数组的接口(interface)。一种方法是使用通用 std::ostream *

然后考虑ostringstream是否是目标:

void WritePNG(ostream *out, const uint8_t *pixels);

void *WritePNGToMemory(uint8_t *pixels)
{
ostringstream out;
WritePng(&out, pixels);

uint8_t *copy = new uint8_t[out.tellp()];
memcpy(copy, out.str().c_str(), out.tellp()];
return copy;
}

但我想避免使用 memcpy()。有没有办法在底层 stringbuf 类中获取数组的所有权并将其返回?

我觉得使用标准库无法做到这一点,因为流缓冲区甚至可能不是连续数组。

最佳答案

如果您愿意使用旧的、已弃用的 <strstream>界面,这相当简单 - 只需创建一个 std::strstreambuf指向您的存储空间,它将神奇地工作。 std::ostrstream甚至有一个构造函数可以为您执行此操作:

#include <iostream>
#include <strstream>

int main()
{
char copy[32] = "";

std::ostrstream(copy, sizeof copy) << "Hello, world!"
<< std::ends << std::flush;

std::cout << copy << '\n';
}

随着更现代<sstream>接口(interface),需要访问字符串流的缓冲区,调用pubsetbuf()使其指向您的存储:

#include <iostream>
#include <sstream>

int main()
{
char copy[32] = "";

{
std::ostringstream out{};
out.rdbuf()->pubsetbuf(copy, sizeof copy);

out << "Hello, world!" << std::ends << std::flush;
}

std::cout << copy << '\n';
}

显然,在这两种情况下,您都需要一种方法来提前知道要为 copy 分配多少内存。 ,因为你不能等到 tellp()已经为你准备好了……

关于c++ - 获取 streambuf/stringbuf 数据的所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50360527/

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