fread读取二进制文件_NCNN-Breakdown(1) 数据读取类DataReader

cb7f9f8bff2fb4963d5a3dbe0e61b4b8.png

开始

从本篇开始,我们来拆解NCNN的代码,共同学习一下NCNN的相关知识.如果有错误,希望大佬指正,大家共同学习.

初步的大计划程如下:

0b547dbd65fd9993195574874cbc3296.png

漏斗显示我们计划还未开始.

由于今天开始DataReader的讲解,所以我们会把第一个漏斗变成一个小红旗:

0382e2728a959c182380c1671e2d9fe1.png

后面的计划可能所有变化,以尽量合理为准.我们今天就开始第一课,那就是DataReader类的学习.

作用

DataReader的作用主要有两个:

  • 读取深度模型的proto信息
  • 读取深度模型的权重信息

模型的proto信息如下,主要是写了一些模型结构的信息,下面是官方的squeezenet的网络proto:

d0db50f9fc18023909bff53d228e82fc.png

模型的权重信息则写到了一个二进制文件中.

实现

先来一张图来看一下类DataReader的实现方式:

39b65b5f4753fe78cc333809ab41a1e3.png

DataReaderFromStdio是DataReader的子类,我们主要用它来实现DataReader类的主要功能.

它包含一个成员变量:

  • fp

它其实是一个FILE的指针,也就是保存了当前读取的数据流的状态.

它包含两个成员函数:

  • scan
  • read

这两个成员函数分别是对fscan和fread的一个包装.

函数scan是按照format格式读取信息的,所以它非常适合读取模型的proto信息.

函数read是安装buffer长度读取信息的,所以它非常适合读取读取模型的权重信息.

具体的实现方式如下:

//scan的读取方式是按照format去读取
int DataReaderFromStdio::scan(const char* format, void* p) const
{
    return fscanf(fp, format, p);
}

//read的读取方式是按照size去读取
size_t DataReaderFromStdio::read(void* buf, size_t size) const
{
    return fread(buf, 1, size, fp);
}

代码示例

关于DataReader的测试代码在这里 ,代码结构如下:

9bed11847032eb5b7edc87477cdcc4c3.png

代码中分别对scan和read做了测试.主要是学习一些基于format和基于buf_size去读取文件的差别.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值