main.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"console.h"
#include"fun.h"
int main(int  argc,char argv[])
{char *file_date=NULL;//存歌词数据char *buf[128]={NULL}; //存分割后的歌词int i=0;            //记录歌词行数int n=0;char name[]="";         //放歌曲名字LRC *head=NULL;  //链表头/*printf("请输入以下歌曲的名字\n");prienf("玫瑰花的葬礼,简单爱");scanf("%s",name);*/file_date=read_file("玫瑰花的葬礼.lrc");//读取歌词数据/* printf("%s",file_date);   */          //测试是否读到//切割歌词buf[i] = strtok(file_date,"\r\n");while(buf[i] !=NULL){i++;buf[i]=strtok(NULL,"\r\n");}n=i;/*  //遍历分割后的歌词i=0;while(buf[i] != NULL){printf("%s\n",buf[i]);i++;}*///分析前四行clear_screen();char *arr[4]={"歌曲","歌手","专辑","制作"};for(i=0;i<3;i++){char tmp[128]="";sscanf(buf[i],"%*[^:]:%[^]]",tmp);cusor_moveto(20,i+1);printf("%s:%s\n",arr[i],tmp);//打印前四行}for(i=4;i<n;i++){//歌词的位置char *str_lrc = buf[i];while(*str_lrc =='['){str_lrc+=10;}char *str_time = buf[i];while(*str_time == '['){int m = 0;int s = 0;int time = 0;sscanf(str_time,"[%d:%d.41]", &m,&s);time = m*60+s;LRC tmp;tmp.time = time;strcpy(tmp.lrc,str_lrc);head = insert_link(head,tmp);//插入链表str_time  += 10;}}/* print_link(head);*/     //遍历链表mplayer_play("玫瑰花的葬礼.mp3");int j = 0;char gun1[128]="";char gun2[128]="";char gun3[128]="";char gun4[128]="";while(1){cusor_moveto(20,7);printf("%02d:%02d",j/60,j%60);fflush(stdout);LRC *ret = search_link(head,j);if(ret != NULL){strcpy(gun1,gun2);strcpy(gun2,gun3);strcpy(gun3,gun4);strcpy(gun4,ret->lrc);cusor_moveto(15,9);printf("%s                ",gun1);cusor_moveto(15,10);printf("%s                ",gun2);cusor_moveto(15,11);printf("%s                ",gun3);cusor_moveto(15,12);set_fg_color(COLOR_YELLOW);printf("%s                 ",ret->lrc);set_fg_color(COLOR_BLACK);fflush(stdout);}sleep(1);j++;}return 0;
}

fun.c

#include<stdio.h>
#include <unistd.h>
#include<stdlib.h>
#include"fun.h"
char* read_file(char *name)  //读取歌词
{char *data=NULL;long file_length = 0;FILE *fp=NULL;fp = fopen(name ,"r");if(fp==NULL){perror("fopen");return NULL;}fseek(fp,0,2);file_length=ftell(fp);rewind(fp);data=(char*)calloc(1,file_length);if (data==NULL){perror("calloc");return NULL;}fread(data,file_length,1,fp);fclose(fp);return data;
}LRC* insert_link(LRC *head,LRC tmp)//链表插入
{LRC *pi =(LRC *)calloc(1,sizeof(LRC));if(pi==NULL){perror("calloc");return head;}*pi = tmp;pi->next=NULL;if(head==NULL){head=pi;return head;}else{LRC *pb=head,*pf=head;while(pb->time<pi->time &&pb->next!=NULL){pf = pb;pb = pb->next;}if(pb->time>=pi->time){if(pb==head){pi->next=head;head=pi;return head;}else{pf->next=pi;pi->next=pb;return head;}}else{pb->next=pi;return head;}}return head;}void  print_link(LRC *head)//打印链表
{if(head==NULL){printf("link not find");return;}else{LRC *pb=head;do{printf("time =%d,lrc=%s\n",pb->time,pb->lrc);pb=pb->next;}while(pb!=NULL);}return ;
}LRC* search_link(LRC *head,int j)//查询链表
{if(head ==NULL){printf("link not find");return NULL;}else{LRC *pb=head;while(pb->time!= j &&pb->next!=NULL){pb=pb->next;}if(pb->time==j){return pb;}else{return NULL;}}return NULL;}void mplayer_play(char * song_path)//播放歌曲函数
{pid_t pid;pid=fork();if(pid<0){perror("fork");}else if(pid==0){close(1);close(2);execlp("mplayer","mplayer","-slave","-quiet",song_path,NULL);exit(0);}else;
}

fun.h

#ifndef __FUN_H__
#define __FUN_H__
typedef struct lrc
{int time;char lrc[128];struct lrc *next; }LRC;
extern char* read_file(char *name);
extern LRC* insert_link(LRC *head,LRC tmp);
extern void  print_link(LRC *head);
extern LRC* search_link(LRC *head,int j);
extern void mplayer_play(char * song_path);
#endif

console.c

#include <stdio.h>
#include <stdlib.h>
#include "console.h"void cusor_moveto(int x, int y)
{// ESC[y;xHprintf("\033[%d;%dH",y,x);fflush(stdout);
} //保存光标位置
void cusor_get_pos(void)
{// ESC[sprintf("\033[s");fflush(stdout);
} //恢复光标位置
void cusor_set_pos(void)
{// ESC[uprintf("\033[u");fflush(stdout);
}
void cusor_hide(void)
{printf("\033[?25l");
}
//清屏
void clear_screen(void)
{// ESC[2Jprintf("\033[2J");fflush(stdout);
}/*
COLOR_RED              红
COLOR_BLACK            黑
COLOR_GREEN            绿
COLOR_BLUE             蓝
COLOR_YELLOW           黄
COLOR_WHITE            白
COLOR_CYAN             青
COLOR_MAGENTA          洋红
*/
//设置前景颜色
void set_fg_color(int color)
{// ESC[#mprintf("\033[%dm",color);fflush(stdout);
}//设置背景颜色
void set_bg_color(int color)
{// ESC[#mprintf("\033[%dm",(color+10));fflush(stdout);
}

console.h

#ifndef  _CONSOLE_H_
#define  _CONSOLE_H_#define     COLOR_RED              31
#define     COLOR_BLACK            30
#define     COLOR_GREEN            32
#define     COLOR_BLUE             34
#define     COLOR_YELLOW           33
#define     COLOR_WHITE            37
#define     COLOR_CYAN             36
#define     COLOR_MAGENTA          35
/*
COLOR_RED              红
COLOR_BLACK            黑
COLOR_GREEN            绿
COLOR_BLUE             蓝
COLOR_YELLOW           黄
COLOR_WHITE            白
COLOR_CYAN             青
COLOR_MAGENTA          洋红
*/extern void cusor_moveto(int x, int y);//光标跳转到 y行 x列
extern void cusor_get_pos(void);//保存光标位置
extern void cusor_hide(void);
extern void cusor_set_pos(void);//恢复光标位置
extern void clear_screen(void);//清屏
extern void set_fg_color(int color);//设置字体前景色
extern void set_bg_color(int color);//设置字体背景色#endif //_CONSOLE_H_

小白学习,歌词解析(全)相关推荐

  1. Qt正则表达式学习之LRC歌词解析器

    正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表通常被用来检索.替换那些符合某个模式(规则)的文 ...

  2. python在冒号处显示语法错误_深入解析Python小白学习【操作列表】

    1.遍历列表 需要对列表中的每个元素都执行相同的操作时,可使用for 循环: magicians = ['alice','david','carolina'] for magician in magi ...

  3. 设计模式学习(四):基于Builder模式的歌词解析器

    一.前言 上篇文章(设计模式学习(三):生成器(Builder)模式)记录了 Builder 模式的具体内容,这次使用C语言来实现一个实际的例子--基于Builder模式的歌词解析器. 本文的示例来自 ...

  4. 小白学习freemark的过程(代码全贴+详细介绍)

    介绍 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 环境 学习工具 ...

  5. SEO小白学习与实践(二):SEO相关基础知识与自有网站诊断

    前言 两年前建网站的时候,一切都是从百度检索开始的,遇到问题就问度娘.后来发现,这样的方法不是很好.度娘可以帮助解决铁定问题,但是非常系统的知识最好还是从书本上获取.于是,这次SEO学习咱就改变思路, ...

  6. 前端小白学习路线及知识点汇总(三)-- JavaScript基础

    前端小白学习路线及知识点汇总(三)-- JavaScript基础 一. JavaScript的组成 ECMAScript:由ECMA国际进行标准化的一门编程语言,往往被称为JavaScript或Jsc ...

  7. 小白学习pytorch源码(二):setup.py最详细解读

    小白学习pytorch源码(二) pytorch setup.py最全解析 setup.py与setuptools setup.py最详细解读 setup.py 环境检查 setup.py setup ...

  8. 深度学习常见问题解析

    深度学习常见问题解析 计算机视觉与自动驾驶 今天 一.为什么深层神经网络难以训练? 1.梯度消失.梯度消失是指通过隐藏层从后向前看,梯度会变得越来越小,说明前面层的学习会显著慢于后面层的学习,所以学习 ...

  9. 零基础编程入门python视频-Python编程零基础小白快速入门完整全系列精品课

    1. 课程咨询加老师助理微信:助理1微信: chenjinglei88 ,助理2微信: omf6757 2. 决定购买并想得到陈敬雷老师亲自指导(课程或自己项目难题均可)加老师微信: chenjing ...

  10. 小白学python买什么书-终于明白小白学习python怎么学

    Python作为一门新型的编程语言(一般常用作脚本语言)很受欢迎,毕竟相对其他的编程语言(Java ,C#等)来说比较容易入手.那么,在刚开始学习Python时有哪些疑难点需要掌握呢?以下是小编为你整 ...

最新文章

  1. 里面不仅有强悍的zhajinhuaplayer
  2. 【数学工具?拉普拉斯机制?随机响应?】差分隐私系统学习记录(二)
  3. 代理网络中安装tomcat的注意事项
  4. 基于特定实体的文本情感分类总结(PART II)
  5. Linux Server - NIS
  6. ott盒子 MySQL_LAMP源码环境搭建与phpmyadmin的使用
  7. 宠物医院管理系统(毕设)遇到的问题
  8. c语言中难度程序,c语言自学难度高么
  9. 【教你快速让基本磁盘转换成动态磁盘】
  10. 通信时代的发展与5G未来的发展方向以及面临的业务挑战
  11. 小武匠师PPT 基础篇(一)-武文杰-专题视频课程
  12. 计算机进入睡眠状态网络还通么,电脑休眠模式怎么正常连接网络
  13. allegro cadence bubble 灰色不可用
  14. 公司股权分配协议范文
  15. 『Hi,我是易建科技eKing Cloud!』
  16. 华为服务器1u系列,服务器 1u
  17. 本人从事Java十余年~是时候收徒弟~包教包会~深藏功与名~
  18. 用串口连接 设置超级终端管理交换机(转)
  19. 单片机中断嵌套语句c语言,关于赛元单片机的中断嵌套的问题求解答
  20. 数据交易隐私保护,数据转卖,交易公平

热门文章

  1. 爱快路由系统带PPPOE服务器吗,爱快路由+华为交换机 实现vlan下拨号到爱快pppoe服务器...
  2. ubuntu 笔记本亮度调节
  3. 《计算机网络》第三章课后答案第七版谢希仁
  4. uni-app微信小程序扫普通二维码分享小程序
  5. 【系】微信小程序云开发实战坚果商城-扩展篇
  6. linkMap深度解析
  7. 一步一步学Silverlight 2系列(1):创建一个基本的Silverlight应用
  8. Android:ViewPager详细解释(异步网络负载图片,有图片缓存,)并与导航点
  9. 计算机专业的在职研究生,计算机在职研究生考什么
  10. 《滚雪球:巴菲特和他的财富人生》【美】艾丽斯·施罗德著