C++ 二进制文件和迭代器:使用 ifstreambuf_iterator 摆脱 1:1 的束缚?

2023-12-24

这个答案 https://stackoverflow.com/a/13665583/2485710指出 C++ 不太适合对二进制文件进行迭代这一事实,但这正是我现在所需要的,简而言之,我需要以“二进制”方式操作文件,是的,所有文件都是二进制的,即使是 . txt 的,但我正在编写一些对图像文件进行操作的东西,因此我需要读取结构良好的文件,并且数据以特定方式排列。

我想读取数据结构中的整个文件,例如std::vector<T>所以我几乎可以立即关闭文件并处理内存中的内容,而无需再关心磁盘 I/O。

目前,根据标准库对文件执行完整迭代的最佳方法是:

std::ifstream ifs(filename, std::ios::binary);
  for (std::istreambuf_iterator<char, std::char_traits<char> > it(ifs.rdbuf());
       it != std::istreambuf_iterator<char, std::char_traits<char> >(); it++) {
    // do something with *it;
  }
ifs.close();

or use std::copy,但即使有std::copy你总是在使用istreambuf迭代器(所以如果我正确理解 C++ 文档,那么基本上每次调用之前的代码都会读取 1 个字节)。

所以问题是:如何编写自定义迭代器?我应该从哪里继承?

我认为这在将文件写入磁盘时也很重要,并且我认为我可以使用相同的迭代器类进行写入,如果我错了,请随时纠正我。


是可以优化的std::copy() using std::istreambuf_iterator<char>但几乎没有任何实现可以做到这一点。仅仅从某些东西派生也不会真正起作用,因为这不是迭代器的工作方式。

最有效的内置方法可能是将文件简单地转储到std::ostringstream并得到一个std::string从那里:

std::ostringstream out;
out << file.rdbuf();
std::string content = out.str();

如果您想避免旅行经过std::string您可以编写一个流缓冲区,直接将内容转储到内存区域或std::vector<unsigned char>并使用上面的输出操作。

The std::istreambuf_iterator<char>原则上,s 可以有一个流缓冲区的后门并绕过字符操作。如果没有后门,您将无法使用这些迭代器来加速任何事情。你could使用流缓冲区的顶部创建一个迭代器sgetn()处理类似的缓冲区。在这种情况下,你几乎需要一个版本std::copy()有效地处理段(即缓冲区的每次填充)。如果没有的话,我只需使用流缓冲区将文件读入缓冲区并对其进行迭代。

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

C++ 二进制文件和迭代器:使用 ifstreambuf_iterator 摆脱 1:1 的束缚? 的相关文章

  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 为什么极端下派生类(多重虚拟继承)的大小包括超类成员大小的两倍?

    include
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 使用 C# 读取 Soap 消息

  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单

随机推荐

  • 如何在 MVC 索引页面中显示导航属性集合中的值

    我有一个名为 JobTitle 的 EF 实体类型 它有一个名为 Offices 的导航属性 它是另一个名为 Office 的实体类型的集合 我想在索引视图中显示 JobTitle 名称和相关 Office 名称的列表 View 脚手架默认
  • 使用 python 中的 csv 模块写入特定单元格

    我必须向 csv 文件中的特定单元格 例如第 8 个单元格 写入一个值 我可以看到有一个csvwriter writerow row 方法来写入整行 但我没有看到任何将值写入特定单元格的内容 The csv模块 http docs pyth
  • 使用现有 R 会话中的对象运行 Sweave 或 knit

    假设我有一个对象x在我当前的会话中 x lt 1 如何在 Sweave 或 knit 文档中使用此对象 而无需显式分配它 documentclass article begin document lt lt gt gt print x en
  • 如何自动启动 AlarmManager 来启动计划活动?

    本教程来自android er http android er blogspot com 2011 05 using alarmmanager to start scheduled html 主活动 AndroidScheduledActi
  • 在 Android 中改造没有值的 GET

    我在大多数调用中都使用 Retrofit 但在其中一种情况下 我在参数中提供了完整路径 我的网址是这样的http www example com android json http www example com android json
  • css 字体大小和行高与基线不匹配

    我正在尝试做一些应该非常简单的事情 但我在失败和论坛之间度过了一天 我想调整我的字体以匹配我的基线 在 indesign 中只需点击一下即可 但在 css 中这看起来是地球上最困难的事情 让我们举一个有理值的简单例子 在这张图片上 我每 2
  • Theano 张量切片...如何使用布尔值进行切片?

    在 numpy 中 如果我有一个布尔数组 我可以用它来选择另一个数组的元素 gt gt gt import numpy as np gt gt gt x np array 1 2 3 gt gt gt idx np array True F
  • 如何重用多处理池?

    底部是我现在拥有的代码 看起来效果很好 但是 我并不完全理解它 我以为没有 join 我冒着在池完成执行之前代码进入下一个 for 循环的风险 我们不需要那 3 行注释掉的行吗 另一方面 如果我要和 close and join 方式 有什
  • 影响数据库的 Angular e2e 测试

    这是我的问题 一步一步 我认为这样读起来更好 不像一堵文字墙可怜地试图解释我的特定领域的问题 1 我们有一个Angular js应用程序与PHP后端支持MongoDB贮存 2 Protractor用于端到端测试 3 需要测试改变数据库的页面
  • C# HttpWebRequest POST 不发送参数

    我正在尝试使用下一个代码执行带有参数的 POST 请求 我正在使用本地 php 脚本来接收参数 但是当我执行请求时 php 脚本没有接收从我的 C 函数发送的参数 它说 注意 未定义索引 detalle 注意 未定义索引 method pa
  • Glassfish - 上传图像 - 正确执行

    我使用的是最新的 glassfish 3 1 2 所以不需要 apache FileItem 并且 getPart 没有错误 我读到上传图像的最佳实践是将它们保存在文件系统上 请参阅here https stackoverflow com
  • 如何查看包的历史记录?

    如何查看 Npm 注册表中包的历史记录 我特别想知道什么时候https npmjs org package npm https npmjs org package npm1 1 2版本发布 你可以做npm view npm您可以在以下位置找
  • 删除as3中的空格

    如何从 as3 中的字符串中删除空格 我希望能够删除所有回车符 空格 制表符等 您可以使用正则表达式 var rex RegExp s r n gim var str String This is a string str str repl
  • 即使 Ant 任务失败,Ant 也会成功

    我一定缺少一个简单的设置 所以请原谅我 但我有两次注意到我的坏蚂蚁任务不会导致构建失败 例如 当源文件不存在时 Ant 复制 构建成功 Ant 解压缩 当任务报告 无法写入文件 或类似消息时 构建成功 Ant 执行错误 语法无效 构建成功
  • 如何在WPF中叠加图像?

    我有两个图像需要重叠 例如 我需要在实心矩形顶部有一个实心圆 所以 我可以看到整个圆 但只能看到矩形的角 我不希望圆圈是透明的 原本的circle png没有矩形边框 它的边界仅沿着圆的边界 因此 理想情况下 整个圆不应与矩形重叠 这是显示
  • 员工工资查询错误

    我正在尝试制作一家公司的薪资报告 我想通过使用如下查询来显示该公司的所有员工 select tab1 name tab1 job tab1 salary tab2 discount days tab1 salary tab1 salary
  • cmd中转义特殊字符

    我有一个 Windows bat 脚本 在其中尝试运行参数中包含密码的命令 我希望能够使用的密码是 gt lt 从我读到的here http ss64 com nt syntax esc html 我应该逃走 lt gt with 根据我的
  • glDrawArrays 上的 OpenGL ES EXC_BAD_ACCESS

    我在 OpenGL ES 1 1 中为我正在构建的 iPhone 游戏进行渲染时遇到问题 简而言之 我正在渲染 3 个项目 背景 效果很好 许多球形物体 效果很好 一个改变大小的简单线圆 我在这里遇到问题 基本上 当我在圆上调用 drawA
  • 如何生成 Identity Server 签名证书

    在身份服务器示例中 我们发现这样的代码Startup cs var certFile env ApplicationBasePath idsrv3test pfx var signingCertificate new X509Certifi
  • C++ 二进制文件和迭代器:使用 ifstreambuf_iterator 摆脱 1:1 的束缚?

    这个答案 https stackoverflow com a 13665583 2485710指出 C 不太适合对二进制文件进行迭代这一事实 但这正是我现在所需要的 简而言之 我需要以 二进制 方式操作文件 是的 所有文件都是二进制的 即使