如何将 istream 与字符串一起使用

2023-11-23

我想将文件读入字符串。我正在寻找不同的方法来有效地做到这一点。

使用固定大小的 *char 缓冲区

我收到了answer来自 Tony 的内容创建了一个 16 kb 缓冲区并读取该缓冲区并追加该缓冲区,直到没有更多内容可读取。我了解它是如何工作的,并且很快就找到了它。我不明白的是,在该答案的评论中据说这种方式将所有内容复制两次。但据我了解,它只发生在内存中,而不是从磁盘中发生,所以它几乎是不可察觉的。它从缓冲区复制到内存中的字符串是否有问题?

使用 istreambuf_iterator

The 其他答案我收到了使用 istreambuf_iterator 的信息。代码看起来很漂亮而且很简洁,但是速度非常慢。我不知道为什么会这样。为什么这些迭代器这么慢?

使用 memcpy()

For 这个问题我收到的评论说我应该使用 memcpy(),因为它是最快的本机方法。但是如何将 memcpy() 与字符串和 ifstream 对象一起使用? ifstream 不应该使用它自己的读取功能吗?为什么使用 memcpy() 会破坏可移植性?我正在寻找一个与 VS2010 以及 GCC 兼容的解决方案。为什么 memcpy() 不能与这些一起使用?

+ 还有其他有效的方法吗?

对于

(我不想将这个问题分成几部分,因为我更感兴趣的是如何将 ifstream 读入字符串的不同方式之间的比较)


它只发生在内存中,而不是从磁盘中发生,因此几乎不易察觉

这确实是正确的。不过,不这样做的解决方案可能会更快。

为什么这些迭代器这么慢?

代码很慢不是因为迭代器,而是因为字符串不知道要分配多少内存:istreambuf_iterators 只能遍历一次,因此字符串本质上被迫执行重复连接,从而导致内存重新分配,这是非常慢的。

我最喜欢的一句台词,来自另一个答案直接从底层缓冲区流式传输:

string str(static_cast<stringstream const&>(stringstream() << in.rdbuf()).str());

在最近的平台上,这确实会预先分配缓冲区。然而,它仍然会导致冗余副本(来自stringstream到最后的字符串)。

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

如何将 istream 与字符串一起使用 的相关文章

随机推荐

  • Excel - VBA:将变量从子传递到用户窗体

    我已阅读并应用了在类似主题上找到的解决方案 但似乎对我的情况没有任何作用 因此 我想将一个变量从 Module1 的一个子模块传递到用户窗体 这是一个名为 provinceSugg 的字符串 这是我的代码的相关部分 Public provi
  • 在二维数组中创建相似元素集

    我正在尝试解决基于二维数组的问题 该数组包含不同类型的元素 总共 3 种可能的类型 让我们假设类型为 X Y Z 该数组看起来是这样的 请注意 它总是被完全填满 该图仅供说明之用 7 6 5 4 X Z Y X 3 Y X Y Y X 2
  • 什么是好的Jsp IDE

    我是一名 C 开发人员 但有一份涉及一些 jsp 代码的工作 我一直在使用记事本 它在突出显示方面做得很好 但我缺少智能感知 并且发现很难找到我需要的方法 对于喜欢 C 并具有智能感知功能的人来说 什么是好的 jsp IDE Update
  • 在 bash 无限循环期间禁用用户输入

    我有这个 bash 脚本 它基本上启动带有进度指示器的 Web 和 selenium 服务器 由于硒服务器启动需要一些时间 我正在无限循环中检查状态 问题是 在等待它启动时 我不小心按下了按键 它会显示在屏幕上 如果循环结束 超时 它也会显
  • C# 中的 HTTP 代理服务器

    我的公司正在尝试使用 NET Fx 3 5 和 C 编写代理服务器 来自我们的research我读到 HttpListener 不是代理服务器的良好候选者 尽管我不确定为什么 我们目前正在与Mentalis代理示例源代码尽管这将涉及到实现我
  • 如何在屏幕之间切换?

    我是 Android 开发世界的新手 我创建了简单的应用程序 并通过一个按钮创建了一个简单的 GUI 如果用户按下此按钮 我想更改屏幕以显示其他 GUI 我怎样才能做到这一点 你可以这样做 import android view View
  • Golang - 如何从代码内部显示模块版本

    我正在编写两个二进制文件 它们都使用两个库 我们可以称它们为 libA 和 libB 每个库都位于专用的 git 存储库中 并使用 git 标签来声明版本 例如 libA 的版本为 v1 0 9 libB 的版本为 v0 0 12 两个二进
  • 所有小提琴的面积相同,与 ggplot2 中的面无关

    我想为三个不同的因素创建一个图 其中所有小提琴都具有相同的面积 但使用facet grid C 似乎迫使每个方面内的小提琴 即仅在因子 C 水平内的小提琴 具有相同的面积 我怎样才能克服这个问题 library ggplot2 d lt d
  • 在 Gradle 中,如何生成具有解析为实际使用版本的动态依赖项的 POM 文件?

    在 Gradle 中 如何生成具有解析为实际使用版本的动态依赖项的 POM 文件 dependencies testCompile group junit name junit version 4 这是从上面的依赖关系生成的
  • 如何在 ASP.NET 运行时更改 FormsCookieName

    我们希望根据应用程序实例更改 FormsCookiePath 的 FormsCookieName 我们有一个应用程序 在 1 个服务器 域名上有多个实例 因此 我们只能同时在 1 个应用程序中工作 因为 cookie 会互相覆盖 顺便说一句
  • 无法使用 Vue CLI 3 要求“fs”

    我正在使用 Vue CLI 3 开发适用于 Windows 10 的调度软件 该应用程序需要使用 fs 模块 但是 我找不到方法 任何地方都没有 webpack 配置文件 我该如何解决这个问题 Vue CLI 3 是如此不同 以至于我无法使
  • jQuery .load() 不加载脚本

    我有 jQuery load 功能类似于 load to html 页面 targetID load load from html bodyPart script 但是 这似乎没有从 load from html 页面加载 javascri
  • 如何将系统命令输出存储在变量中?

    我正在执行一个 system 函数 它返回一个文件名 现在我不想在屏幕上显示输出 即文件名 或通过管道传输到新文件 我只想将其存储在变量中 那可能吗 如果是这样 怎么办 谢谢 单个文件名 是的 这当然是可能的 但不使用system Use
  • 批量删除文件名中的字符

    我在 Windows 资源管理器中有 3 个主文件夹 其中包含命名类似于 ALB 01 00000 intsect d kml 或 Baxters Creek AL intsect d kml 的文件 尽管第一个名称发生了变化 但我想从所有
  • HTML5 Canvas:缩放

    有没有简单的方法可以在画布 JavaScript 中放大和缩小 基本上我有一个 400x400px 的画布 我希望能够使用 mousedown 2x 放大并使用 mouseup 返回 过去两天用谷歌搜索 但到目前为止还没有运气 基于使用 d
  • 等待背景图像(css)加载完毕

    假设我们有一个图片幻灯片 这些图片的缩略图显示在带有滑块的 div 包装器中 我用 Jquery 创建的 并且每个图像都包含在 li 带有 CSS 背景集 它当然代表图像 我选择使用背景图像来进行布局 因为它们的大小和纵横比都不同 图像来自
  • 有哪些方法可以在 AngularJS 中显示“分块”响应?

    目前 我在显示从 Web 服务 Node js 服务器 localhost 3000 发送到 Node js 服务器 localhost 3001 上运行的模拟客户端的响应 块 时遇到问题 编辑 当前实现仅使用 Angular 的 http
  • 我可以从 popen() 流打开 bash 吗?

    根据 popen 的手册页 我正在打开 bin sh 有没有办法可以重载此行为以打开 bin bash shell 并与 BASH shell 脚本交互 或者我是否需要打开 pty 风格的连接才能做到这一点 如果您想在传递给的代码片段中使用
  • Android 警报对话框并设置肯定按钮

    这是用于滑块拼图的 我想在拼图完成时显示一个带有 确定 按钮的对话框 当按下 确定 按钮时 我使用Intent通过 Android 浏览器加载网站 唯一的问题是 使用当前代码 当拼图完成时 它不会加载盒子 当我使用null 它没有任何作用
  • 如何将 istream 与字符串一起使用

    我想将文件读入字符串 我正在寻找不同的方法来有效地做到这一点 使用固定大小的 char 缓冲区 我收到了answer来自 Tony 的内容创建了一个 16 kb 缓冲区并读取该缓冲区并追加该缓冲区 直到没有更多内容可读取 我了解它是如何工作