如何从 std::ifstream 将文件读入 unsigned char 数组?

2023-11-21

所以通常我会做这样的事情:

    std::ifstream stream;
    int buff_length = 8192;
    boost::shared_array<char> buffer( new char[buff_length]);
    stream.open( path.string().c_str(), std::ios_base::binary);
    while (stream)
    {
            stream.read(buffer.get(), buff_length);
            //boost::asio::write(*socket, boost::asio::buffer(buffer.get(), stream.gcount()));
    }
    stream.close();

我想知道如何读入unsigned char缓冲 (boost::shared_array<unsigned char> buffer( new unsigned char[buff_length]);)


以最简单的形式:

std::vector<unsigned char> vec(
      std::istreambuf_iterator<char>(std::cin)
    , std::istreambuf_iterator<char>()
    );

Replace std::cin与您的实际流。

上面的代码可能会执行多次内存分配(对于大于几个字节的文件),因为std::istreambuf_iterator<>是一个输入迭代器,而不是随机访问或前向迭代器,因此文件的长度不能通过减去迭代器来测量,例如end - begin或致电std::distance(begin, end)。如果向量首先创建为空,则可以减少到一次内存分配,然后std::vector<>::reserve()调用为文件长度分配内存,最后调用范围插入vec.insert(vec.end(), beg, end) with beg and end being std::istreambuf_iterator<>如上所述读取整个文件。

如果文件大小超过几千字节,则将其映射到进程内存以避免将内存从内核复制到用户空间可能是最有效的。

原因std::istreambuf_iterator<char>使用是因为实现使用std::char_traits<>通常只专门针对char and wchar_t。无论如何,C 和 C++ 标准要求所有char类型具有相同的二进制布局,没有填充位,因此之间的转换char, unsigned char and signed char(它们都是不同的类型,不像signed int and int相同类型)保留位模式,因此是安全的。

[基本.根本/1]

Plain char, signed char, and unsigned char是三种不同的类型,统称为窄字符类型. A char, a signed char, 和unsigned char占用相同的存储量,具有相同的对齐要求;也就是说,它们具有相同的对象表示...对于窄字符类型,对象表示的所有位都参与值表示...对于无符号窄字符类型,值表示的每个可能的位模式代表一个不同的数字。这些要求不适用于其他类型。在任何特定的实现中,一个简单的char对象可以采用与 a 相同的值signed char or an unsigned char;哪一个是实现定义的。对于每个值i类型的unsigned char在 0 到 255(含)范围内,存在一个值j类型的char这样积分转换的结果i to char is j,以及积分转换的结果j to unsigned char is i.

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

如何从 std::ifstream 将文件读入 unsigned char 数组? 的相关文章

随机推荐

  • 如何为 HttpClient 请求设置 Content-Type 标头?

    我正在尝试设置Content Type的标头HttpClient我调用的 API 所需的对象 我尝试设置Content Type像下面这样 using var httpClient new HttpClient httpClient Bas
  • 如何处理android中弹出窗口内按钮的onclick事件

    在我的应用程序中 我最初在屏幕上有一个按钮 然后在onclick按钮时 应该会打开一个弹出窗口 在弹出窗口中 我有一个图像按钮 并且onclick通过这个按钮 我想开始一个活动 弹出窗口打开 但我不明白如何处理onclick弹出窗口内的图像
  • 如何将科学记数法转换为小数形式?

    虽然很基本 但我在任何地方都找不到答案 如何禁用小标题中的科学记数法 并让小标题显示小数 My data 我有一个简单的小题 结果是lm gt broom tidy library tidyverse I used dput to get
  • 每侧有 2 个 y 轴且比例不同的 ggplot

    我需要在一个图表中绘制一个显示计数的条形图和一个显示比率的折线图 我可以单独完成这两个图表 但是当我将它们放在一起时 我会缩放第一层 即geom bar 与第二层重叠 即geom line 我可以移动轴吗geom line向右 Answer
  • 屏蔽 CALayer - iPhone

    我正在为 iPhone 创建一个自定义开 关切换开 关 类似于标准开关 并且我正在设置滑块的蒙版 但调用 myView layer setMask maskLayer 设置遮罩层相对于其遮罩层的位置 而不是相对于遮罩层的容器层的位置 对于这
  • 如何让 raw_input 重复直到我想退出?

    说我想用raw input像这样 code raw input Please enter your three letter code or a blank line to quit under if name main 如何让它在每次运行
  • 如何从头开始构建具有人类可读角度的旋转矩阵?

    一直阻碍我进行 3D 编程的一件事是无法理解数学是如何运作的 我可以使用方法和函数在编程流程中很好地遵循数学 那么对我来说一切都清晰且合乎逻辑 但在数学符号中 我只是无法从中得到正面或反面 我一直在阅读网站 观看一些机构的视频试图解释这一点
  • 正则表达式删除多行注释

    我正在尝试使用这个正则表达式 JS g 取代 sdandsads 什么也没有 但它不起作用 为什么 o O 点捕获除换行符之外的所有内容 如果 dotall 为 false 所以要么使用 dotall 正如其他答案 评论中提到的 这在 ja
  • Android:折叠线性布局而不是折叠工具栏

    我正在尝试在单个片段中创建主 详细信息事务 我考虑使用 LinearLayout 作为标题的编辑文本的容器 然后是 RecyclerView 了解详细信息 如何实现类似于 CollapsingToolbar 效果的 LinearLayout
  • Kibana 报告字段存在冲突,我该如何解决?

    在 Kibana 中 我注意到在刷新索引模式后 我的一个字段显示为conflicted Example 所以我知道这是因为 Elastic Search 在该字段中发现了不同类型的值 我如何确定这一点 它导致我的视 觉效果破坏 因为它们无法
  • C# 两组排序数字最快的交集

    我正在应用程序的时间关键部分计算两组排序数字的交集 这个计算是整个应用程序的最大瓶颈 所以我需要加快它的速度 我已经尝试了很多简单的选项 目前正在使用这个 foreach var index in firstSet if secondSet
  • 如何理解 Yahoo! 的原始 HTML使用Python检索数据时的财务?

    我一直在尝试从 Yahoo 检索股票价格 金融 比如苹果公司 我的代码是这样的 使用Python 2 import requests from bs4 import BeautifulSoup as bs html http finance
  • 获取不带 Content-Disposition 的文件名

    我几天来一直在寻找这个问题的解决方案 但找不到任何解决方案 我想使用网络客户端从网络服务器下载文件 下载工作正常 但我无法获得真实的文件名 这对我来说非常重要 我在很多主页上看到 文件名应该保存在 Content Disposition H
  • Android 不使用 XML 指定像素单位(如 sp、px、dp)

    是否可以在代码中指定像素单位 我的意思是 假设我有一个布局 并且我希望大小为 20dp 那么有什么方法可以在不编写布局 xml 的情况下做到这一点 在一个视图中 DisplayMetrics metrics getContext getRe
  • 全屏视频无黑边

    我遇到的问题是 视频总是在侧面或顶部 底部出现黑条 具体取决于屏幕尺寸 知道如何让它始终全屏显示而不显示恼人的黑条吗 并且不使用插件 这是我的标记 div div class box iframe box width 1280 height
  • 使用 java 在 Selenium WebDriver 中垂直向下滚动和向上滚动

    有人可以帮我自动化吗向下滚动功能 with 网络驱动程序 using Java 就我而言 对于雅虎邮件 Sign In 正在显示 visible 一旦我垂直向下滚动鼠标 滚动到页面的某个元素 JavascriptExecutor drive
  • 通过替换求解递推式 T(n) = 2T(n/2) + θ(1)

    所以我很确定它是 O n 但也可能不是 但是如何通过替换来解决它 如果假设 T n 首先 我想清楚地假设 1 k 某个常数 接下来 继续使用替换法 我们得到 T n 2T n 2 1 2T n 2 k 2 2T n 4 k k 4T n 4
  • selenium.common.exceptions.SessionNotCreatedException:消息:无法通过 Selenium 找到与 Firefox 46 匹配的功能集

    我这里肯定有一些版本不匹配 因为我无法使用 Python 来启动 Selenium 来启动 Firefox Web 浏览器 我使用旧版本的 Firefox 因为这里的其他人都使用相同的旧版本 Python 并且对他们来说旧版本的 Firef
  • 什么是函数 __tcf_0? (使用gprof和g++时看到)

    我们使用 g 4 2 4 我试图找出代码中的一些性能问题 我正在运行 gprof 来生成配置文件 并且我得到以下 奇怪的信息 因为最昂贵的函数是 tcf 0 Each sample counts as 0 01 seconds cumula
  • 如何从 std::ifstream 将文件读入 unsigned char 数组?

    所以通常我会做这样的事情 std ifstream stream int buff length 8192 boost shared array