- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想要一个用于写入自动调整大小数组的接口(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/
我需要将进程的标准输出(二进制数据)放入字符串缓冲区并在另一个线程中使用它。 这是制作人: while (ReadFile(ffmpeg_OUT_Rd, cbBuffer, sizeof(cbBuff
struct encrypt_stream : public std::stringbuf { int sync() { encrypt_buffer(); flush_to_device()
当我们必须处理字符串操作时,std::string 和 std::stringbuf 之间是否存在任何显着的性能差异,如果是,为什么。 更一般地说,什么时候最好使用 std::stringbuf 而不
我想要一个用于写入自动调整大小数组的接口(interface)。一种方法是使用通用 std::ostream *。 然后考虑ostringstream是否是目标: void WritePNG(ostr
我有一个大致如下所示的 C++ 类(参见下面的代码)。它有一个输入缓冲区和一个使用 std::stringbuf 的输出缓冲区。因为我还想访问原始缓冲区,所以我使用 std::stringbuf.pu
我不明白为什么我的编译器 (MSVC++2010) 不喜欢这段代码: // get_sum(filename as c-string) returns sum from file in
我在这里要做的是将一个 stringbuf 对象转换为一个 char 数组。 我这样做是为了将 char 数组发送到不理解类型 std::stringbuf 的 C 接口(interface)。 这是
我正在尝试对手动缓冲(通过 std::stringbuf )对运行时间的影响进行基准测试,同时执行对文件的写入,而不是插入运算符 << 完成的缓冲。 . 版本 1(无手动缓冲) 此版本涉及在每次迭代时
MathWorks 目前不允许您在 MATLAB 桌面打开时使用 mex 文件中的 cout,因为它们已重定向标准输出。他们当前的解决方法是提供一个函数,mexPrintf, that they re
我正在两个框架(OpenSceneGraph 和 wxWidgets)之间进行内存中图像转换。不想关心底层类(osg::Image 和 wxImage),我使用两个 API 都提供的面向流的 I/O
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 7 年前。 Improve t
我是一名优秀的程序员,十分优秀!