反其道而用之,把数组写入文件2

 上一篇介绍了如何把数组写入文件,但是遇到大数组,问题就来了。有一个朋友给我了一个MP4的资源数组,竟然达到了20多M,把他导入C文件后,先是数组超大,设置了ZM后,C文件也超大了。值此方知道在VC中,不仅数组有大小限制,单个C文件也有大小限制。遇到这种情况,害怕只有使用读文件来解决了,把数组数据存入一个文件,读取数组里的内容,把ASC码转为数字,直接写入扩展名为MP4的文件中。由于这类分析要写出十分完美适合在各种场合使用的程序比较复杂,就以我上次写的把资源写入数组为例。该程序会把数组按每行十六个字节存放,每个数组元素后有一个逗号和一个空格,每行结尾有一个空格和一个换行符。把数组头和尾去掉,只留下数组数据,存入文件aa.h的文件中,使用下面的程序可以对数组解码,还原成MID文件。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>
const unsigned char  aa[2] ={0x00};

int main(void)
{
 FILE *pF;
 FILE *pIn;
 unsigned char tmp[10] = {0}, a, h, l;
 long len;
 long curpos;

 
 pF=fopen((char *)"D://mymid.mid","wb");
 if (NULL==pF)
 {
  printf("open write file error!!");
  return 1;
 }
 pIn = fopen((char *)"D://aa.h", "rb");
 if (NULL==pIn)
 {
  printf("open read file error!!");
  return 1;
 }
    fseek(pIn,0,SEEK_END);
 len=ftell(pIn);        //获取文件长度
 fseek(pIn,0,SEEK_SET);
 while (len > 0)
 {
  fread(&tmp,6,1,pIn);         //按六个字节读取数据,0+x+F+F+,+SPACE

  if (tmp[2]<='9')          //第二三个字节存放的是数组的十六进制数据
  {
   h  = tmp[2] - '0';     //把0到9的ASC码转为数字
  }
  else
  {
   h  =tmp[2] - 'a'+ 10;   //把A到F的数据转为10到15的数字
  }
  if (tmp[3]<='9')
  {
   l  =tmp[3]- '0';
  }
  else
  {
   l  =tmp[3]- 'a' + 10;
  }
  a = h<<4|l;               //把两个字节的数组数据存为一个一字节写入文件
  putc(a, pF);
  if (getc(pIn) != 0x0D)     //判断是否是换行符,如果不是,文件指针前移
  { 
   curpos = ftell(pIn);
   fseek(pIn,curpos-1,0);
  }
  else                       //如果是换行符,文件指针后移一位,因为换行符两个字节,0X0D,0X0A
  {
   curpos = ftell(pIn);
   fseek(pIn,curpos+1,0);
   len -= 2;
  }
  len -= 6;
 }

 fclose(pIn);
 fclose(pF);
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值