当前位置: 首页 > news >正文

一个简单的读写文件程序-适用于MTK平台资源管理

DOS下运行的软件具有编写简单,操作快捷,支持批操作等一系列优点,所以在Win和各种可视化操作系统极大盛行的今天,仍然能够在电脑中看到他的身影。这里提供一个我写的MTK铃声生成工具。把下面的C代码拷贝到VC里直接编译就可以了。把客户提供的铃声放到同一个文件夹里,把生成的.exe文件拷贝到该文件里后,双击就可以生成需要的C文件。这里主要使用了读写文件函数和查找文件函数,并提供了一个查找相关类型文件的算法,简单的对MAIN函数参数做了解析。该程序主要用于MTK平台开发,MTK平台使用的铃声与图片一般都是以数组方式存放,而手工使用UE把铃声或者图片打开,一个一个的存放到数组里显然是不现实的。写一个小程序实现该功能,有时有一件很有趣的事,既可以复习一下C语言知识,也可以学以致用。本程序是在匆匆之下写就,错误之处在所难免,欢迎指证。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>

#define FORMAT_IMY (18) /* sync with med_main.h */
#define FORMAT_MID (17) /* sync with med_main.h */
#define FORMAT_WAV (13) /* sync with med_main.h */
#define FORMAT_MMF (20) /* sync with med_main.h */
#define FORMAT_MP3 (5) /* sync with med_main.h */
#define FORMAT_PCM (7) /* sync with med_main.h */
#define FORMAT_DVI (11) /* sync with med_main.h */
#define FORMAT_AMR (3) /* sync with med_main.h */

char * getfilename(char * filename)
{
char strResult[128]={0}; //保存结果
char *temp, *ret;
int i;

temp = filename;
int nStrLen = strlen(filename); //原始字符串长度

for(i = nStrLen - 1; i >= 0; i--) //倒查,每个字符和反斜杠对比
{
if (filename[i] == '\\') //如果当前字符是反斜杠
{
break;
}
}
if(i == 0)
{
ret = temp;
}
else
{
ret = (temp+i+1);
}
return (ret);
}
char * getfileextname(char * filename)
{
char strResult[128]={0}; //保存结果
char *temp, *ret;
int i;

temp = filename;
int nStrLen = strlen(filename); //原始字符串长度

for(i = nStrLen - 1; i >= 0; i--) //倒查,每个字符和反斜杠对比
{
if (filename[i] == '.') //如果当前字符是反斜杠
{
ret = (temp+i+1);
break;
}
}

return (ret);
}
BOOL isMusicFile(char * filename)
{

if (memcmp(filename, "null", 4)==0)
{
return false;
}

if ((memcmp(getfileextname(filename), "mp3", 3) == 0) ||
(memcmp(getfileextname(filename), "mid", 3) == 0) ||
(memcmp(getfileextname(filename), "wav", 3) == 0)
)
{
return true;
}
else
{
return false;
}
}
int getfilevalue(char * extfilename)
{
if (memcmp(extfilename, "mp3", 3) == 0)
{
return (int)FORMAT_MP3;
}
else if (memcmp(extfilename, "mid", 3) == 0)
{
return (int)FORMAT_MID;
}
else if (memcmp(extfilename, "wav", 3) == 0)
{
return (int)FORMAT_WAV;
}
else
{
return 0;
}
}
char * modifystr(char * str)
{
char *tmp;
int i;

tmp = str;
for (i = 0; i < (int)strlen(str)-1; i++)
{
if ((str[i] == ' ') || (str[i] == '.'))
{
*(tmp+i) = '_';
}
}

return tmp;
}
int music2res(char * music, char * res)
{
long infileLen; //文件长度
int n=0,num=1; //n 字节计数器, NUM换行指示
unsigned char c, c_in; //C_in文件字节,C转化
FILE *fh_in;
FILE *fh_out;
char com[256]={0};
char filename[256]={0};

assert((music != NULL) && (res != NULL));

fh_in = fopen(music,"rb");
if (NULL==fh_in)
{
printf("open read file error!!");
return 1;
}

fseek(fh_in,0,SEEK_END);
infileLen=ftell(fh_in);
fseek(fh_in,0,SEEK_SET);

fh_out=fopen(res,"ab");
if (NULL==fh_out)
{
printf("open write file error!!");
return 1;
}
/*写入注释*/
memcpy(filename, getfilename(music), 256);

sprintf(com, "/*The alert is : %s, size is: %ld byte */", filename, infileLen);
fputs(com, fh_out);
putc(0x0d,fh_out);
putc('\n',fh_out);
memset(com, 0x00, 128);

modifystr(filename);
sprintf(com, "__align(2) static const unsigned char %s[] = {", filename);
fputs(com, fh_out);
putc(0x0d,fh_out);
putc('\n',fh_out);
/*写入数据*/
while (n<(infileLen))
{
putc('0',fh_out);
putc('x',fh_out);
c_in=getc(fh_in);
c=c_in;

c=(c>>4)&0x0f; //获取高四个BIT的内容
if (c<0x0a)
{
c+=0x30; //把符号转成数字
}
else
{
c+=0x37; //转成a到f
}
putc(c,fh_out);
c=c_in&0x0f; //获取低四个BIT内容
if (c<0x0a)
{
c+=0x30;
}
else
{
c+=0x37;
}
putc(c,fh_out);
putc(',',fh_out);
n++;

if (num++ % 16 ==0)
{
putc(0x0d,fh_out);
putc('\n',fh_out);
}


}
putc('}',fh_out);
putc(0x0d,fh_out);
putc('\n',fh_out);

memset(com, 0x00, 128);
sprintf(com, "{%s, sizeof(%s), %d}", filename, filename, getfilevalue(getfileextname(music)));
fputs(com, fh_out);
putc(0x0d,fh_out);
putc('\n',fh_out);

fclose(fh_in);
fclose(fh_out);
return 0;
}
int main(int argc, char* argv[])
{
WIN32_FIND_DATA fd;

HANDLE hd=::FindFirstFile((LPCTSTR)"*.*",&fd); //开始查找
if(hd==INVALID_HANDLE_VALUE)
{
if (!isMusicFile(fd.cFileName))
printf("没有找到文件");
return 0;
}
if(!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
{
if (isMusicFile(fd.cFileName))
{
music2res(fd.cFileName, (char *)"resource_audio.c");
}
}
while(FindNextFile(hd,&fd)) //继续查找
{
if(!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
{
if (isMusicFile(fd.cFileName))
{
music2res(fd.cFileName, (char *)"resource_audio.c");
}
}
}
FindClose(hd);//关闭查找
return 0;
}

相关文章:

  • [LeetCode]—Simplify Path 简化路径表达式
  • 如何编写跨平台应用程序
  • Gartner:2009~2010年值得关注的8大移动技术
  • 金玉良言十六句
  • 将 Flex 集成到 Java EE 应用程序的最佳实践
  • Java软件工程师几个面试问题
  • 互联网创业几个思路
  • Asp.net 中文件以Binary 形式数据库的保存和读取
  • [LeetCode]—Permutations 求全排列
  • [LeetCode]—Permutations II 求全排列(有重复值)
  • 动态装卸DLL示例-匪徒和
  • 一个困扰我一个多星期的Nebula3的BUG
  • [Python]—Linux Server 系统监控程序
  • .NET 4.0中使用内存映射文件实现进程通讯
  • 中国移动短信指令大全
  • Angular 4.x 动态创建组件
  • CAP 一致性协议及应用解析
  • Date型的使用
  • IOS评论框不贴底(ios12新bug)
  • java多线程
  • JDK 6和JDK 7中的substring()方法
  • Koa2 之文件上传下载
  • Laravel5.4 Queues队列学习
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Redis 中的布隆过滤器
  • SpiderData 2019年2月23日 DApp数据排行榜
  • SpringBoot 实战 (三) | 配置文件详解
  • Vue学习第二天
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 思维导图—你不知道的JavaScript中卷
  • 学习HTTP相关知识笔记
  • 移动端唤起键盘时取消position:fixed定位
  • 原生js练习题---第五课
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转载)虚函数剖析
  • ./和../以及/和~之间的区别
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET delegate 委托 、 Event 事件
  • .net wcf memory gates checking failed
  • .NET 中创建支持集合初始化器的类型
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .sh
  • .ui文件相关
  • ?.的用法
  • [20170705]diff比较执行结果的内容.txt
  • [Angular 基础] - 指令(directives)
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码