将固定长度的数据从 std::istream 复制到字符串

2024-06-28

我想将固定长度的数据从 std::istream 复制到字符串:

std::istream & operator >> ( std::istream & is, LogMsg & msg )
{
    // read in 4 bytes - a uint32_t that describes the number of bytes in message:
    // next, read the message bytes into the LogMsg

    typedef std::istream_iterator<unsigned char> Iter;

    Iter            i (is);
    uint32_t        nSize   = 0;
    std::string &   sMsg    = msg.MsgRef();

    is >> nSize;
    sMsg.reserve(nSize);

    std::copy(
        i.begin(), i.begin() + nSize,
        std::back_inserter(sMsg)
    );

    return is;
}

我无法使用此解决方案,因为迭代器上的 std::istream_iterator::begin() 函数仅是 c++11 (我仅限于 -std=gnu++0x 和 gcc 4.4.7

那么,如何将固定长度的数据从输入流复制到字符串中呢?

我最初查看了 std::istream::read,它似乎适合 - 它具有以下语法

is.read (buffer,length);

但我认为您无法读取字符串的内部缓冲区,并且我想避免复制到临时缓冲区。我可以以某种方式使用streambuf吗?


显而易见的解决方案是std::copy_n:

std::copy_n( std::istreambuf_iterator<char>( is ), size, std::back_inserter( msg ) );

只有当你可以确定角色在那里时这才有效, 然而。如果您在尝试读取文件时遇到文件结尾 字符,会发生未定义的行为。这意味着虽然它是 这是一个显而易见的解决方案,但它可能不是一个好的解决方案。

然而,在 C++11 中,官方以及早期的实现中, 实践中,可以读入内部缓冲区。你必须确保 字符串有足够的空间:

msg.resize( size );
is.read( &msg[0], msg.size() );

(由于某种原因,没有非常量版本std::string::data(),尽管保证了基本连续性 C++11。)

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

将固定长度的数据从 std::istream 复制到字符串 的相关文章

随机推荐

  • Python Decimal 模块不适用于 uint64

    我正在尝试将 numpy uint64 由 numpy sum 输出 转换为小数 而不会丢失 Decimal 模块的精度 gt gt gt from decimal import Decimal gt gt gt import numpy
  • 如何在 // 注释中转义反斜杠

    我有一条以反斜杠结尾的评论 就像是 use Clang 警告我 这是多行注释 warning multi line comment Wcomment use 所以我尝试在末尾添加一些空格 但没有帮助 我可以以某种方式逃避反斜杠吗 问题的基础
  • 使用 XQuery 更新自动递增?

    Does XQuery更新支持自增属性 就像中的自增字段一样SQL 我在用着BaseX作为我的数据库 Given Christian Gr n 在 BaseX 邮件列表上的回答 https mailman uni konstanz de p
  • 为什么反斜杠出现两次?

    当我创建包含反斜杠的字符串时 它们会重复 gt gt gt my string why does it happen gt gt gt my string why does it happen Why 你所看到的是表示 of my stri
  • 在javascript中打开本地文件系统中的文件

    我正在寻找一种在 IE 和 Firefox 浏览器中使用 javascript 打开临时目录中的 xls 文件的方法 我尝试使用 JavaScript 如下所示 function openMe var newwindow window op
  • WPF 绑定无法与 int 类型的属性正常工作

    我拥有以下财产int输入我的视图模型 该模型绑定到TextBox 一切正常 TwoWay绑定工作正常 除了一种情况 如果我清除的值TextBox 属性设置器不会被调用 尽管值已被清除TextBox 属性仍保持先前的值 有人遇到过类似的问题吗
  • javascript 如何将对象深度绑定到新的“this”值

    我有一个值 它可能是一个原语或一个函数或一个递归地包含原语 函数 对象的对象 Given a theThis参数 我如何将可能在我的值内的所有函数深度绑定到theThis 我尝试过类似的东西 function deepBind o ths
  • 使用 Glide 进行缩放和遮罩

    我只是想看看是否有人可以为我指明正确的方向 以学习如何使用 Glide 来完成此任务 我们有一个包含内容的页面 内容显示为单个图像 想想 杂志页面的图像 在轻松阅读模式下 我想将第一块居中并缩放 文本内容并屏蔽其余内容 单击 下一步 时 我
  • 如何构建具有依赖关系的单元测试?

    给出以下简单示例 class MathObject object A completely superfluous class def add self a b return a b def multiply self a b result
  • T[] 和 T[*,*] 有什么区别?

    我的谷歌柔术让我失望了 问题在标题中 有什么区别T and T 我正在寻找 2 2 1 2 部分的答案 外行 或超级架构师 的简单英语解释和示例代码 链接到此区别的正式文档 额外奖励 指向定义此内容的 C 4 规范中的小节和页码 它不在第
  • Android 1.5:读取短信

    我正在为 Android 创建一个备份实用程序 我需要读取收件箱 发件箱和 dratfs 的内容 如何在 SDK v1 5 上实现这一点 有一个内容提供商 http developer android com guide topics pr
  • 如何让 PyC​​harm 识别 SQL 语句中的占位符?

    我正在使用 PyCharm 但此 SQL 语句有错误 SELECT FROM table WHERE id id s 代码语法检查说
  • React:在 TS 组件中使用 ES6 组件:TS2605:JSX 元素类型“xxx”不是 JSX 元素的构造函数

    我想在另一个 Typescript 组件中使用 ES6 React 组件 ES6 组件 class ModelViewer extends Component constructor props context super props co
  • Python套接字发生错误

    我写了这段代码 import socket host localhost port 3794 s socket socket socket AF INET socket SOCK DGRAM s setsockopt socket SOL
  • Delphi 使用 标记将 TXMLData 包装在 SOAP 请求中

    我使用 TXMLData 发送 XML Delphi 在请求中添加一个标签 我的代码如下 RequestData TXMLData Create RequestData LoadFromXML
  • 使用 contenteditable div 时隐藏移动设备上的软键盘

    我正在使用 contenteditable div 来创建由移动设备查看的页面 以获取某些内容的输入 我希望当用户按下 Enter 时隐藏软键盘 而不是在 div 中按 Enter 的正常操作 我第一次尝试让它工作看起来像这样 if eve
  • UTF-16-LE 文件的 Python 字符串替换

    Python 2 6 使用 Python string replace 似乎不适用于 UTF 16 LE 文件 我想到了2种方法 找到一个可以处理 Unicode 字符串操作的 Python 模块 将目标 Unicode 文件转换为 ASC
  • java 9模块的命名约定[重复]

    这个问题在这里已经有答案了 java 9 模块的命名约定是什么 假设我的包名称是me jasonyeo awesome project 每当我创建一个module info javaIDEA 中的文件 它会建议我命名它awesome pro
  • 使用 loc 命令替换值

    有一个数据框 我需要replace值高于 512 时为 263 因此 我首先使用此代码行来过滤索引 df loc df Fare gt 512 Fare astype int 这是结果 258 512 679 512 737 512 123
  • 将固定长度的数据从 std::istream 复制到字符串

    我想将固定长度的数据从 std istream 复制到字符串 std istream operator gt gt std istream is LogMsg msg read in 4 bytes a uint32 t that desc