从 ostream 获取 char* 而不进行复制

2024-03-13

我有一个ostream并且数据已写入其中。现在我想要该数据的形式char大批。有没有办法在不复制所有字节的情况下获取字符缓冲区及其大小?我的意思是,我知道我可以使用ostringstream并打电话str().c_str()但会产生一个临时副本。


我想这就是您正在寻找的 - 一个返回指向其缓冲区的指针的流缓冲区:

#include <iostream>
#include <vector>
#include <string>

class raw_buffer : public std::streambuf
{
public:
    raw_buffer(std::ostream& os, int buf_size = 256);
    int_type overflow(int_type c) override;
    std::streamsize showmanyc() override;
    std::streamsize xsputn(const char_type*, std::streamsize) override; 
    int sync() override;
    bool flush();
    std::string const& str() const;
private:
    std::ostream& os_;
    std::vector<char> buffer;
    std::string aux;
};

Now str()很简单。它返回一个指向辅助缓冲区的底层缓冲区的指针:

std::string const& raw_buffer::str() const
{
    return aux;
}

其余函数是流缓冲区的常见实现。showmanyc()应返回辅助缓冲区的大小(aux只是整个缓冲区的运行总计,buffer另一方面是施工时指定的尺寸)。

例如,这里是overflow(),它应该同时更新两个缓冲区,但仍然处理buffer作为主缓冲区:

raw_buffer::int_type raw_buffer::overflow(raw_buffer::int_type c) override
{   
    if (os_ && !traits_type::eq_int_type(c, traits_type::eof()))
    {
        aux += *this->pptr() = traits_type::to_char_type(c);
        this->pbump(1);

        if (flush())
        {
            this->pbump(-(this->pptr() - this->pbase()));
            this->setp(this->buffer.data(),
                       this->buffer.data() + this->buffer.size());
            return c;
        } 
    }
    return traits_type::eof();
}

flush()用于复制内容buffer到流(os_), and sync()应该被覆盖来调用flush() too.

xsputn还需要重写才能写入aux还有:

std::streamsize raw_buffer::xsputn(const raw_buffer::char_type* str, std::streamsize count) override
{
    for (int i = 0; i < count; ++i)
    {
        if (traits_type::eq_int_type(this->sputc(str[i]), traits_type::eof()))
            return i;
        else
            aux += str[i];
    }
    return count;
}

现在我们可以将其与自定义流结合起来:

class raw_ostream : private virtual raw_buffer
                  , public std::ostream
{
public:
    raw_ostream(std::ostream& os) : raw_buffer(os)
                                  , std::ostream(this)
    { }

    std::string const& str() const
    {
        return this->raw_buffer::str();
    }

    std::streamsize count()
    {
        return this->str().size();
    }
};

它可以这样使用:

int main()
{
    raw_ostream rostr(std::cout);
    rostr << "Hello, World " << 123 << true << false;

    auto& buf = rostr.str();
    std::cout << buf;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 ostream 获取 char* 而不进行复制 的相关文章

随机推荐

  • 未知提供商 CookieStore

    我正在提供服务 我想使用 cookieStore 模块 它工作正常 但是当单元测试时它会中断 并给出错误 cookieStoreProvider 该服务如下所示 serviceModule factory filtersService ro
  • 如何将 --relative 与 git format-patch 一起使用?

    当我使用git diff relative HEAD HEAD 我得到了一些不错的补丁输出 我删除了它所在目录之外的路径 我开始使用git format patch我也想用 relative但没有看到任何选项 我怎样才能得到同样的效果 Th
  • 从空 Swift 数组中获取对象类型

    有没有办法从空数组中获取数组元素的实例 我需要dynamic属性 因为我使用了一些 KVC 方法NSObject import Foundation class BaseClass NSObject func myFunction doWo
  • 如何获取 Python 字符串中括号内的值? [复制]

    这个问题在这里已经有答案了 我有这样的事情 a 2 3 4 b 12 3 5 我只想要括号内的值 我使用正则表达式 它有效 但我的老师不允许 我怎样才能做到这一点 gt gt gt a 2 3 4 gt gt gt a a index 1
  • C语言——调用没有函数原型的函数

    I found here http opencbp sourceforge net en US ISO8859 1 books opencbook func prototypes html如果函数位于函数调用之下 则函数原型在函数调用之前是
  • Python tk框架

    我有生成以下错误的 python 代码 objc 36554 Class TKApplication is implemented in both Library Frameworks Tk framework Versions 8 5 T
  • 如何禁用文本小部件的输入但允许编程输入?

    我该如何锁定一个Text小部件 以便用户只能选择并从中复制文本 但我仍然可以将文本插入到Text来自函数或类似函数 您是否尝试过简单地禁用文本小部件 text widget configure state disabled 在某些平台上 您
  • 长时间运行 RTS 游戏多人注意事项

    我正在开发一款实时太空策略游戏克隆游戏 该游戏当时没有任何多人游戏选项 我想添加多人游戏 游戏本身的时间比较长 大约需要10 15小时才能通关 这很长 我不想强 迫玩家不间断地玩它或由于崩溃 断电而失去游戏状态 类似的游戏是如何解决此类问题
  • 格式化代码片段以在 Blogger 上写博客 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的博客托管在 Blogger 上 我经常在以下位置发布代码片段C C Java XML等等 但我发现该片段被 损坏 是否有任何网站可以用来预先解析代
  • helper' aria-label=''####' 的未定义方法 `merge':string <%= form_for %> helper'> '####' 的未定义方法 `merge':string <%= form_for %> helper

    我有一个表单 当发布时 会呈现另一个表单 我想做的是将第一个表单中的参数传递到第二个表单的某些隐藏字段中 第二种表单使用 form for 表单助手 我想做的是让它接受发布给它的参数 表格如下所示 div class found l div
  • Facebook 开放图私人群组提要请求

    我想从图形 api 获取数据 特别是我尝试从组中获取时间线 例如 让我们看一下 Facebook 开发人员概述中提供的请求 https graph facebook com 195466193802264 https graph faceb
  • (int)、Convert.ToInt32(x) 或 Int32.Parse(x) 哪个最快?

    以下哪段代码对于转换某些对象 x 是最快 最佳实践 int myInt int x or int myInt Convert ToInt32 x or int myInt Int32 Parse x 或者在字符串 s 的情况下 int my
  • 将 .NET 表达式树链接到新程序集中

    我正在尝试编写自己的玩具 My Toy Language gt MSIL 编译器 以便更好地了解编译器的工作原理 我的解析和词法分析工作正常 我已经构建了表达式树并使用 System Linq Expressions 表达式树 API 我有
  • Realm 与 Firestore 上的大型集合同步 - 架构问题/问题

    我在 Firestore 集合中有一个产品对象集合 标题 描述 价格 定量 urlString 等 目前大约有 1000 件商品 但可能会达到 10k 在我的 iOS 应用程序启动时 我设置了一个集合侦听器 db collection pr
  • 如何将 gt 表保存到 Excel 或 Word 文件

    将我漂亮的表格提交给出版商后 他们希望将其保存为 Word 或 Excel 文件 有没有一种简单的方法可以将 gt 表保存为任一格式 或者我最好在 Excel 中重做它们 以下是将 gtsummary 表导出到 Excel 或 RTF 的一
  • spring 4 中的自定义 ExceptionTranslationFilter 来处理 REST AuthenticationException

    我有一个由 Spring Security 保护的 Spring MVC RESTful 应用程序 客户端是 Angular JS 但我的登录和注销页面是普通的 jsp 并且我进行基于表单的登录和注销 成功完成完全身份验证后 我加载我的安全
  • 如何从 Firebase Cloud Functions 删除日志

    我只是在玩Cloud Functions on Firebase并部署了一些随机函数来测试它 现在我想删除所有logs on Firebase console但我找不到办法 有没有CLI命令来做到这一点 或者它会永远存在 或者它们会随着年龄
  • 如何在 Matlab 中计算 3D 网格的投影

    我正在尝试使用 matlab 从不同视图计算 3d 网格的 2d 投影 我现在使用的解决方案是绘制 3D 网格 旋转它并制作屏幕截图 我想知道是否有任何 matlab 内部函数或任何其他解决方案允许我在给定一组顶点和三角形的情况下计算投影而
  • 为什么仅针对 POST 请求,Firebase 上托管的 NextJs 应用会收到“502 Gateway”错误?

    我开始使用 NextJs 框架构建 API 我希望将其托管在 Firebase 上 托管和功能 只要我只发送 GET 请求 一切就正常 当我发送 POST 请求时 我收到一个 502错误的网关 error 复制起来非常简单 您只需下载并部署
  • 从 ostream 获取 char* 而不进行复制

    我有一个ostream并且数据已写入其中 现在我想要该数据的形式char大批 有没有办法在不复制所有字节的情况下获取字符缓冲区及其大小 我的意思是 我知道我可以使用ostringstream并打电话str c str 但会产生一个临时副本