如何从 wfstream 读取二进制数据?

2024-05-08

我从文件读取数据时遇到一个小问题。我希望能够读取 wstring 以及任意大小的原始数据块(大小以字节为单位)。

std::wfstream stream(file.c_str());

std::wstring comType;
stream >> comType;

int comSize;
stream >> comSize;

char *comData = new char[comSize];
memset(comData, 0, comSize);
stream.read(comData, comSize); 
//error C2664 : 'std::basic_istream<_Elem,_Traits>::read' 
//            : cannot convert parameter 1 from 'char *' to 'wchar_t *'

也许我使用了错误的流,或者类似的东西。基本上,我想读取一个 wstring,后面跟着数据的大小(可以是任意数量的字节),后面跟着那么多字节的组件数据。显然,我无法读取 char,因为模板假定为 wchar_t。

我可以读取 wchar_t,但是我必须确保数据按 sizeof(wchar_t) 对齐存储。否则,我最终可能会破坏流。一种情况是数据为 15 字节。我必须读取 16 个字节,然后屏蔽不需要的字节,将流查找到 15 个字节偏移量(如果可能的话使用 wchar_t 模板化?)才能读取下一个数据块。

显然,有should是实现我想做的事情的更好方法。


考虑到您的要求,我认为 wfstream 不是正确的选择。考虑使用类似以下代码片段的内容。

#include "stdafx.h"
#include <fstream>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    std::wstring str(L"hello");
    size_t size1 = str.length();
    char data[] = { 0x10, 0x20, 0x30 };
    size_t size2 = 3;

    FILE* output = NULL;
    if (_wfopen_s(&output, L"c:\\test.bin", L"wb") == 0) {
        fwrite(&size1, sizeof(size_t), 1, output);
        fwrite(str.c_str(), size1 * sizeof(wchar_t), 1, output);
        fwrite(&size2, sizeof(size_t), 1, output);
        fwrite(data, size2, 1, output);

        fclose(output);
    }

    FILE* input = NULL;
    if (_wfopen_s(&input, L"c:\\test.bin", L"rb") == 0) {
        fread(&size1, sizeof(size_t), 1, input);
        wchar_t* wstr = new wchar_t[size1 + 1];
        fread(wstr, size1 * sizeof(wchar_t), 1, input);
        std::wstring str(wstr, size1);
        delete[] wstr;
        fread(&size2, sizeof(size_t), 1, input);
        char* data1 = new char[size2];
        fread(data1, size2, 1, input);

        std::wcout << str.c_str() << std::endl;
        for (size_t i = 0; i < size2; ++i) {
            std::wcout << std::hex << "0x" << int(data1[i]) << std::endl;
        }

        delete[] data1;

        fclose(input);
    }

    return 0;
}

这输出:

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

如何从 wfstream 读取二进制数据? 的相关文章

  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke

随机推荐

  • TypeError: 使用 ajax 时 google.load 不是一个函数

    我正在使用 Google 图表 termcloud 来显示一些数据 我可以让它作为页面上的静态功能正常工作 但是当我尝试通过 ajax 加载图表及其资产时 它似乎一直抛出错误 TypeError google load is not a f
  • 如何在 MongoDB 2.6 副本集上启用 HTTP 控制台

    我正在运行一个 3 服务器 MongoDB 副本集 我最近从 2 4 升级到 2 6 在 2 4 中 我能够访问所有三台服务器上的 HTTP 控制台 无论它们是主服务器还是辅助服务器 现在 2 6 需要不同的配置设置来启用控制台 Disab
  • 是否有一个函数可以检查矩阵是否对角占优(行占优)

    矩阵是对角占优 http en wikipedia org wiki Diagonally dominant matrix 按行 如果对角线处的值在绝对意义上大于该行中所有其他绝对值的总和 对于列也是如此 只是相反 matlab中有没有函数
  • 构造一个逻辑表达式来计算字节中的位数

    在面试新候选人时 我们通常要求他们编写一段 C 代码来计算给定字节变量中值为 1 的位数 例如 字节 3 有两个 1 位 我知道所有常见的答案 例如右移八次 或索引 256 个预先计算结果的常量表 但是 有没有更聪明的方法而不使用预先计算的
  • 对 EmberJS 对象的反思?如何在事先不知道密钥的情况下查找属性密钥列表

    如果您事先不知道所有密钥 是否有办法检索 EmberJS 对象的 set at creations 属性 通过检查器 我看到所有似乎存储在元对象中的对象属性values哈希 但我似乎找不到任何方法来恢复它 例如object getPrope
  • UIPageControl 未显示

    我使用以下内容来显示滚动视图和页面控制 scrollView UIScrollView alloc initWithFrame CGRectMake 0 0 320 179 pageControl UIPageControl alloc i
  • 如何使用 __getattr__ 将方法委托给属性?

    我有以下课程 class MyInt def init self v if type v int raise ValueError value must be an int self v v def getattr self attr re
  • AngularJS 过滤器精确匹配

    我需要按类别过滤项目列表 我希望用户能够单击按钮 然后将过滤器应用于列表 目前 我已经在一定程度上做到了这一点 比方说 我有一个电影列表 呈现如下 li movie title li 我还有一个电影类型列表 呈现为按钮 单击时将过滤电影列表
  • 如何在 Ruby On Rails 7 中使用导入映射访问 JS 函数?

    我是 JS 模块和导入映射的新手 现在我正在使用 Ruby on Rails 7 但我找不到一种方法来让它工作 Js模块 proposals js function openProposalMirror 应用程序 js import as
  • 如何用NULL替换空格

    我在 sql server 2012 中有一个包含空格的列 我想用 NULL 替换这些空白 我已经编写了以下查询 但它不起作用 SELECT replace COLUMN1 NULL FROM Orders 如何实现上述功能 提前致谢 Us
  • RxAndroid - 单击时重试可观察

    我在 Android 应用程序中使用 rxAndroid 和 rxKotlin 来异步处理网络请求 现在我想仅在单击 Snackbar 按钮后重试失败的网络请求 我现在的代码 val citiesService ApiFactory cit
  • Scala 如何将 Map 转换为元组的可变参数?

    在 Scala Play 2 2 x 测试的背景下 我有一个Map String String 我需要将其传递给接受的函数 String String 即一个可变参数 String String tuple e g val data Map
  • 使用仅应用程序令牌时 Microsoft Graph API /search() 是否有效

    我正在尝试使用图形 API v1 0 来搜索我们团队的 sharepoint onedrive 文件夹中的文件和文件夹 但是当使用仅限应用程序的令牌时 我始终得不到任何结果 search 要求我试试 我已注册并申请https apps de
  • Vue.js - 在 V-For 中将多个 Props 传递给 Child

    我正在尝试创建一个具有可折叠列的表格 但无法使表主体与标题一起折叠 这是一个小提琴 它清楚地表明了我想要做什么 https jsfiddle net ufw4f5qc 9 https jsfiddle net ufw4f5qc 9 这是我尝
  • Android 两次请求 USB 许可

    我有一个运行 Android 4 0 4 的开发板 并将其用作 USB 配件 当我关闭板上的应用程序然后通过 USB 插入 Android 手机时 板会提示 连接此 USB 设备时打开 AppName 当我触摸 确定 时 应用程序启动并再次
  • Google Places Api 排名=距离不起作用[重复]

    这个问题在这里已经有答案了 我使用 Google Places api 只获取距我所在位置最近的一些地点 但有些结果根本不显示 例如 tbilisimarriot 和 CourtyardbyMarriot 结果 而且列表也无法正确显示从最近
  • 在 C++11 中使用 max 作为谓词会中断

    在 C 03 中 以下代码工作正常 int main std vector
  • Angular 2.0 是否有类似于 Angular 1 中的 `$setPristine` 函数?

    提交表格后 pristine输入的状态仍然是 假 我不知道如何重置pristine陈述为真 在 Angular 1 中 我会使用 setPristine功能 我查看了 API 和开发人员指南 没有 API 可以将输入重置为原始状态 Inst
  • 编译器创建的匿名类型:可破坏的行为

    我有一些客户端 HTTP RESTfull 代码 这取决于 net 编译器生成的匿名类型提供的舒适度 匿名类型 example0 string prop 1 strValue1 int prop 2 5 new prop1 prop 1 p
  • 如何从 wfstream 读取二进制数据?

    我从文件读取数据时遇到一个小问题 我希望能够读取 wstring 以及任意大小的原始数据块 大小以字节为单位 std wfstream stream file c str std wstring comType stream gt gt c