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