从 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* 而不进行复制 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern

随机推荐

  • 未知提供商 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 但会产生一个临时副本