ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:24.71KB ,
资源ID:8762369      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8762369.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(歌词解析器代码详情.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

歌词解析器代码详情.docx

1、歌词解析器代码详情共6个文件,一个文件夹。Dir目录如下。驱动器 F 中的卷没有标签。 卷的序列号是 18A6-FCB5 F:W.EC语言编程歌词解析器 的目录2013-01-22 16:27 .2013-01-22 16:27 .2013-01-22 16:27 lrc2012-11-19 15:29 9,215 lrc.c2011-12-12 12:17 644 lrc.h2012-09-24 15:18 2,083 main.c2013-01-22 16:27 pos 3 个文件 11,942 字节 4 个目录 171,449,978,880 可用字节Pos下有文件:现将所有文件内容罗列

2、于下,自行分开.c.hMain.c#include #include #include #include #include lrc.h#include ./pos/console.htypedef struct time /表示日期时间的数据结构 char minute; char second;TIME;TIME m_time; /存储模拟时间char * song_msg4; /存储歌曲的信息/* 函数功能:歌词解析器整体的控制* 参数:无* 返回值:无*/int main() int file_length=0; / 存储 lrc文件内容的大小 char * file_buf=NULL;

3、 / 指向malloc的空间,其中存放着lrc 文件中所有的内容 char * lrc_text200=NULL; / 指向,按照 rn 切割后的 一行歌词 int lrc_line=0; / lrc文件中的 行数 int i=0; LRC * head=NULL,*p; / head记录歌词链表头 int s_time=0; / 模拟时间变量 file_buf=read_src_file(&file_length,./lrc/兰亭序.lrc); / 从lrc 文件中读出歌词内容 lrc_line=strtok_lrc_buf(lrc_text,file_buf); / 按行切割歌曲内容 lr

4、c_head_resolve(song_msg,lrc_text); / 切割 歌曲信息 print_song_message(song_msg); / 显示 歌曲信息 head=lrc_resolve(lrc_line,lrc_text); / 保存 时间:歌词 到链表中/ print(head); / 遍历链表,用来测试链表/ ShellExecute( NULL, NULL, TTPlayer.exe,兰亭序.mp3,NULL,1); /开启 千千静听 m_time.second=0; m_time.minute=0; while(1) /每秒钟到链表里面去找相应的歌词,如果找到那么就显

5、示 /* * 1.定位光标,显示歌词 */ GoToXY(20,5); printf(%02d:%02d,m_time.minute,m_time.second); p=search(head,s_time); /到连表里查找当前时间点对应的歌词,如果有那么就返回歌词的首地址 if(p!=NULL) lrc_show(p); /* * 1.运行模拟时间 */ Sleep(500); /延时,注意在windows平台Sleep(1);延时1毫秒 s_time=s_time+1; +m_time.second; if(m_time.second=60) m_time.second=0; +m_ti

6、me.minute; if(m_time.minute=60) m_time.minute=0; return 0;/*/lrc.h#ifndef _LRC_H_#define _LRC_H_ typedef struct lrc int time; char lrc_buf200; struct lrc *next;LRC;extern char * read_src_file(int *file_length,char *src_file_name);extern int strtok_lrc_buf(char *lrc_text,char *file_buf);extern void l

7、rc_head_resolve(char *lrc_head_info,char * lrc_text);extern void print_song_message(char * msg_info);extern LRC * lrc_resolve(int lrc_line,char * lrc_text);extern LRC *InsertList(LRC* head,LRC *lrc_link);extern void print(LRC * head);extern LRC *search (LRC *head,int time);extern void lrc_show(LRC *

8、 pi);extern void print_lrc(char * lrc);#endif/*/lrc.c#include #include #include #include #include lrc.h#include ./pos/console.h/* 函数功能:读出文件内容* 参数:* file_length:整型指针,此地址中保存文件字节数。 * src_file_name:文件名字,从此文件中读取内容。 * 返回值:读出字符串的首地址*/char * read_src_file(int *file_length,char *src_file_name) unsigned long

9、int FILE_SIZE=0; char *src_file_text=NULL; FILE *fp=NULL; fp=fopen(src_file_name,rb); if(fp=NULL) printf(open %s faildn,src_file_name); return 0; fseek(fp,0,SEEK_END); FILE_SIZE=ftell(fp); *file_length=FILE_SIZE; /返回歌词文件内容的大小 rewind(fp); /一定要把“文件指针”移动到文件开始处 src_file_text=(char *)malloc(FILE_SIZE); i

10、f(fread(src_file_text,FILE_SIZE,1,fp)=0) printf(read from src_file faildn); return NULL; fclose(fp); / 关闭文件 return src_file_text ;/* 函数功能:切割 歌词数组* 参数:* lrc_text 指针数组,让其指针指向切出来的内容 * file_buf 歌词内容数组* 返回值:切割出来的字符串的个数*/int strtok_lrc_buf(char *lrc_text,char *file_buf) int i=0; lrc_texti+=strtok(file_buf

11、,rn); while(lrc_texti+=strtok(NULL,rn)!=NULL); return i;/* 函数功能:解析lrc前四行,歌曲的信息如歌手、专辑等。* 参数:* lrc_text 指针数组 lrc 中的前四行 * song_msg 指针数组 用来指向处理好的歌曲信息* 返回值:无*/void lrc_head_resolve(char *song_msg,char * lrc_text) int i=0; char * message=ti,ar,al,by; char * temp; for(i=0;i4;i+)/ 循环四次 找到四个头信息的开始 if (strncm

12、p(lrc_texti,messagei,3)=0) temp = lrc_texti; /* ti:兰亭序 ar:李维 al:情已逝 DSD by:朱古力 */ while( *temp!=) /找到头信息 ,然后改为0 temp+; *temp=0; song_msgi=lrc_texti+4; /跳过 ti: 三个字母,保存歌词信息; /* 函数功能:打印歌曲信息* 参数:* song_msg 歌曲信息 指针数组指向歌曲头信息内容* 返回值:无* 注意点:无*/void print_song_message(char * song_msg) int i=0; char *name4=歌名

13、:,歌手:,专辑:,制作:; for(i=0;i4;i+) printf(%s %sn,namei,song_msgi); /* 函数功能:解析歌曲信息* 参数:* lrc_text 指向歌词内容(以行的方式存储)的指针数组* lrc_line 歌词的行数* 返回值:无*/LRC * lrc_resolve(int lrc_line,char * lrc_text) LRC *head=NULL,*lrc_link; int i=0,j=0,CurOffset; char *LrcFile; int CurTime10; /用来暂时记录歌词中的时间,单位为:毫秒 int num=0; /用来暂

14、时记录本句歌词有多少个时间与其对应 for(i=4;i= 0 & (LrcFileCurOffset) =0 & LrcFileCurOffset =9)/取出这句歌词所有时间标签 CurTimenum+ = ( ( (LrcFileCurOffset - 0) * 10 + (LrcFileCurOffset + 1 - 0) * 60 + (LrcFileCurOffset + 3 - 0) * 10 + LrcFileCurOffset + 4 - 0) * 1000 + (LrcFileCurOffset + 6 - 0) * 100 + (LrcFileCurOffset + 7 -

15、 0)*10; CurOffset=CurOffset+10; /解析一句歌词在不同时间出现的情况时,需要把指针往后偏移10 /lrc = &LrcFileCurOffset-1; /得到这句歌词首地址 “我想大声宣布 对你依依不舍” lrc = LrcFile+10; /根据本句歌词对应的时间个数,把歌词与时间 保存到链表中 for(j=0;jtime = CurTimej; strcpy (lrc_link-lrc_buf,lrc); /将解析出的时间、歌词内容插入到单向链表并进行排序 head = InsertList(head,lrc_link); return head;/* 函数功

16、能:往链表中插入歌词节点。* 参数:* head 链表的头节点地址。 * lrc_link 将要插入的节点首地址。* 返回值:插入之后链表的头节点的地址*/LRC *InsertList(LRC* head,LRC *lrc_link) LRC *pb,*pf; if(head=NULL)/ 如果原先链表为空 head为pi lrc_link-next=NULL; head=lrc_link; return head; pb=pf=head; while( (lrc_link-time pb-time) & (pb-next!=NULL)/ 查找比pi-num 更大的节点 pf=pb; pb=

17、pb-next; if(lrc_link-time time) / 如果上面的while循环式因为找到 lrc_link-time time 而推出的 if(pb=head) / 如果找到的节点为第一个,则pi应该放到head的前面 lrc_link-next=head; / 把pi放到链表里 head=lrc_link; / 把pi变成头节点 else / 如果是pb普通节点的话 在pf和pb之间插入pi pf-next=lrc_link; / pb的前一个节点的指针域 指向pi lrc_link-next=pb; / pi的指针域指向pb else / 如果链表中的节点的time都比 pi

18、-time 小,则插到链表尾端 pb-next=lrc_link; / pb的指针域指向 pi lrc_link-next=NULL; / pi 的下一个为NULL 即pi为链表的尾 return head;/* 函数功能:从歌词链表中查找时间为time的结点* 参数:* head 链表的头节点地址。* time 要查询的时间* 返回值:时间为time的结点的首地址*/LRC *search (LRC *head,int time) /在一个已建立的链表中查找某一节点 LRC *p,*pi=NULL; p=head; /导入已存在链表的头文件 while ( (p-time/1000)!=ti

19、me & p-next!=NULL ) /判断是否找到要找的数据,判断是否到链表尾。 p=p-next; /不是要找的结点后移一步 if ( (p-time/1000)=time ) pi=p; /找到数据则返回相应指针地址 else if (p-next=NULL) /到链表尾则打印数据未找到 pi=NULL; return pi;/* 函数功能:遍历链表* 参数:* head 链表的头节点地址。* 返回值:无*/void print(LRC * head) printf(n链表所有信息如下:n); printf(TIMEttLRC_BUFn); while(head!=NULL) prin

20、tf(%dtt%sn,head-time,head-lrc_buf); head=head-next; printf(n);typedef struct time /表示日期时间的数据结构 char minute; char second;TIME;extern TIME m_time;extern char * song_msg4;char lrc_buf6200=;/* 函数功能:歌词显示 * 参数:* pi 新查找到得 结点* 返回值:无*/void lrc_show(LRC * pi) static int x=0,y=11; static int lrc_num=0; int i=0; if(lrc_numlrc_buf); /lrc_num =0、1、2、3、4、5 if(lrc_num0) GoToXY(x,y-1); printf(%sn,lrc_buflrc_num-1); /只覆盖上1次显示绿颜色的那一行歌词 GoToXY(x,y); print_lrc(pi-lrc_buf); /当

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1