把分区0-6写到block0.txt-block6.txt中【月娇所教】

/*
 *说明:把分区0-6写到block0.txt-block6.txt中
*/

#include <stdio.h>
#include <sys/ioctl.h>
#include <string.h>



//各个分区的大小
#define SIZE_MTDBLOCK0 512*1024
#define SIZE_MTDBLOCK1 2560*1024  //kernel
#define SIZE_MTDBLOCK2 7104*1024  //rootfs
#define SIZE_MTDBLOCK3 16768*1024   //app
#define SIZE_MTDBLOCK4 5376*1024    //www
#define SIZE_MTDBLOCK5 384*1024     //para
#define SIZE_MTDBLOCK6 64*1024     //P2P
//记录写入文件偏移量
 long int size=0;
 //记录文本文件.txt的文件流指针
FILE *fb_txt=NULL;
void WriteFlash(long FlashSize,int num);

/*
 *功能:把SourcePath路径下的文件拷贝到ReadBlock.txt中,大小为ReadSize
 *SourcePath:分区0-6
 *ReadSize:分区的大小
*/
void Copy_BlockFile(char *SourcePath,long ReadSize)
{
    char Buffer[512]={};

    long int pos1=0,pos2=0;
     //记录文件偏移的位置

    FILE *fb_block=fopen(SourcePath,"r");
     //打开要读取的块设备
    if(fb_block == NULL)
    {
        perror("fopen block:");
    }
    size=0;//实际写入文件数据的空间

//读文件
 while(1)
 {
     bzero(Buffer,sizeof(Buffer));
      //将Buffer数组里面的包括\0在内的元素清0

     pos1=ftell(fb_block);
       //获取源文件的偏移量
       //每次光标固定在固定个字符量的后面

    if((fread(Buffer,1,sizeof(Buffer),fb_block))<sizeof(Buffer))
    {
        //从文件指针指向的文件中读取数据,读取sizeof(Buffer)次,每次读取1个字节存放到Buffer数组里去
        //读取的数量没有sizeof(Buffer)次,<小

        pos2=ftell(fb_block);
         //返回文件指针所指文件中字符开头到结尾的字符量
         //这里的开头是,记录的pos1的结尾
         //这里定位到读取完最后的字符后面

        if(feof(fb_block))//读到文件的末尾
        {
            //把剩余的文件写文件
            //列如:每行保存8个字节,但是去读了27个字节的数据,那么第四行仅保存剩余的3的数据
            //所以使用光标第二次所在位 - 第一次所在位 == 实际写入的空间
            fwrite(Buffer,1,pos2-pos1,fb_txt);
             size+=(pos2-pos1)*1;//统计向这个大小的空间写入了几次数据
             break;

        }
        else if (ferror(fb_block))
        {
            //返回有关指定文件的最新文件I / O操作的错误消息
            perror("fread:");
            break;
        }
    }

    //读完了写文件(不看上面,这里是正好读取数组大小的字节)
    fwrite(Buffer,1,sizeof(Buffer),fb_txt);
     size+=sizeof(Buffer);

}

//读取完文件后把剩余的空间填充0xff
// printf("ReadSize=%d,size=%d\n",ReadSize,size);
 if(ReadSize>size)
 {
     //各分区空间>实际写入的空间
     WriteFlash(ReadSize-size,0xff);
 }
 //关闭文件
  fclose(fb_block);



}
/*
 *功能:往fb_txt所指向的文件写入num,大小为flashsize个字节
 *FlashSize:内存大小如:空余的分区
 *num:要写入的数入:0xff
 */

void WriteFlash(long FlashSize,int num)
{
    char Buffer[512]={};
    //读取完文件后把剩余的空间填充0xff
    int i=0,writesize=0;
    //填充的次数---判断剩多少空间
    int times=FlashSize/sizeof(Buffer);

    for(i=0;i<times;i++)
    {
        memset(Buffer,num,sizeof(Buffer));
        fwrite(Buffer,sizeof(num),sizeof(Buffer)/sizeof(num),fb_txt);
        writesize+=sizeof(Buffer);

    }
    memset(Buffer,num,sizeof(Buffer));
    printf("FlashSize:%d-size:%d=%d\n",FlashSize,size,FlashSize-size);

    if(FlashSize>writesize)
    fwrite(Buffer,sizeof(num),FlashSize-writesize,fb_txt);//把最后一次文件写入0xff

}

int main(int argc,char**argv)
{
    fb_txt= fopen("ReadBlock.txt","w");
        //文件不存在会创建一个
    if(fb_txt == NULL)
    {
          perror("fopen txt:");
    }

    Copy_BlockFile("/dev/mtdblock0",SIZE_MTDBLOCK0);
        //将/dev/mtdblock0路径下SIZE_MTDBLOCK0大小的文件拷贝到ReadBlock.txt文件中
    Copy_BlockFile("/dev/mtdblock1",SIZE_MTDBLOCK1);
    Copy_BlockFile("/dev/mtdblock2",SIZE_MTDBLOCK2);
    Copy_BlockFile("/dev/mtdblock3",SIZE_MTDBLOCK3);
    Copy_BlockFile("/dev/mtdblock4",SIZE_MTDBLOCK4);
    Copy_BlockFile("/dev/mtdblock5",SIZE_MTDBLOCK5);
    Copy_BlockFile("/dev/mtdblock6",SIZE_MTDBLOCK6);
    fclose(fb_txt);
    return 0;

}

过程图解

  1. 先把read.c文件放到svnwork可运行目录下
  2. 然后使用命令:arm-histbv320-linux-gcc read.c -o read得到运行程序文件read
  3. 把read拷贝到挂载目录下(已经将APP和GUI的release目录下文件拷贝到此处)

在这里插入图片描述
在这里插入图片描述

  1. 在挂载目录下./read编程文件
  2. 得到下列两个文件

在这里插入图片描述

  1. ReadBlock.txt文件无权限,需要 chmod 777 ReadBlock.txt给与查看权限

在这里插入图片描述

  1. 查看,保存的是二进制文件,如此显示是正常的

在这里插入图片描述

程序图解

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值