小白学习,歌词解析(全)
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_
小白学习,歌词解析(全)相关推荐
- Qt正则表达式学习之LRC歌词解析器
正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表通常被用来检索.替换那些符合某个模式(规则)的文 ...
- python在冒号处显示语法错误_深入解析Python小白学习【操作列表】
1.遍历列表 需要对列表中的每个元素都执行相同的操作时,可使用for 循环: magicians = ['alice','david','carolina'] for magician in magi ...
- 设计模式学习(四):基于Builder模式的歌词解析器
一.前言 上篇文章(设计模式学习(三):生成器(Builder)模式)记录了 Builder 模式的具体内容,这次使用C语言来实现一个实际的例子--基于Builder模式的歌词解析器. 本文的示例来自 ...
- 小白学习freemark的过程(代码全贴+详细介绍)
介绍 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 环境 学习工具 ...
- SEO小白学习与实践(二):SEO相关基础知识与自有网站诊断
前言 两年前建网站的时候,一切都是从百度检索开始的,遇到问题就问度娘.后来发现,这样的方法不是很好.度娘可以帮助解决铁定问题,但是非常系统的知识最好还是从书本上获取.于是,这次SEO学习咱就改变思路, ...
- 前端小白学习路线及知识点汇总(三)-- JavaScript基础
前端小白学习路线及知识点汇总(三)-- JavaScript基础 一. JavaScript的组成 ECMAScript:由ECMA国际进行标准化的一门编程语言,往往被称为JavaScript或Jsc ...
- 小白学习pytorch源码(二):setup.py最详细解读
小白学习pytorch源码(二) pytorch setup.py最全解析 setup.py与setuptools setup.py最详细解读 setup.py 环境检查 setup.py setup ...
- 深度学习常见问题解析
深度学习常见问题解析 计算机视觉与自动驾驶 今天 一.为什么深层神经网络难以训练? 1.梯度消失.梯度消失是指通过隐藏层从后向前看,梯度会变得越来越小,说明前面层的学习会显著慢于后面层的学习,所以学习 ...
- 零基础编程入门python视频-Python编程零基础小白快速入门完整全系列精品课
1. 课程咨询加老师助理微信:助理1微信: chenjinglei88 ,助理2微信: omf6757 2. 决定购买并想得到陈敬雷老师亲自指导(课程或自己项目难题均可)加老师微信: chenjing ...
- 小白学python买什么书-终于明白小白学习python怎么学
Python作为一门新型的编程语言(一般常用作脚本语言)很受欢迎,毕竟相对其他的编程语言(Java ,C#等)来说比较容易入手.那么,在刚开始学习Python时有哪些疑难点需要掌握呢?以下是小编为你整 ...
最新文章
- 里面不仅有强悍的zhajinhuaplayer
- 【数学工具?拉普拉斯机制?随机响应?】差分隐私系统学习记录(二)
- 代理网络中安装tomcat的注意事项
- 基于特定实体的文本情感分类总结(PART II)
- Linux Server - NIS
- ott盒子 MySQL_LAMP源码环境搭建与phpmyadmin的使用
- 宠物医院管理系统(毕设)遇到的问题
- c语言中难度程序,c语言自学难度高么
- 【教你快速让基本磁盘转换成动态磁盘】
- 通信时代的发展与5G未来的发展方向以及面临的业务挑战
- 小武匠师PPT 基础篇(一)-武文杰-专题视频课程
- 计算机进入睡眠状态网络还通么,电脑休眠模式怎么正常连接网络
- allegro cadence bubble 灰色不可用
- 公司股权分配协议范文
- 『Hi,我是易建科技eKing Cloud!』
- 华为服务器1u系列,服务器 1u
- 本人从事Java十余年~是时候收徒弟~包教包会~深藏功与名~
- 用串口连接 设置超级终端管理交换机(转)
- 单片机中断嵌套语句c语言,关于赛元单片机的中断嵌套的问题求解答
- 数据交易隐私保护,数据转卖,交易公平
热门文章
- 爱快路由系统带PPPOE服务器吗,爱快路由+华为交换机 实现vlan下拨号到爱快pppoe服务器...
- ubuntu 笔记本亮度调节
- 《计算机网络》第三章课后答案第七版谢希仁
- uni-app微信小程序扫普通二维码分享小程序
- 【系】微信小程序云开发实战坚果商城-扩展篇
- linkMap深度解析
- 一步一步学Silverlight 2系列(1):创建一个基本的Silverlight应用
- Android:ViewPager详细解释(异步网络负载图片,有图片缓存,)并与导航点
- 计算机专业的在职研究生,计算机在职研究生考什么
- 《滚雪球:巴菲特和他的财富人生》【美】艾丽斯·施罗德著