上一篇介绍了如何把数组写入文件,但是遇到大数组,问题就来了。有一个朋友给我了一个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;
}