C语言 音乐播放器项目(综合)

1.main.c文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <unistd.h>//休眠所需的头文件
#include "./pos/console.h"//光标使用所需的头文件
#include "lrc.h"
#include "./mplayer/start_mplayer.h"//播放歌曲的头文件

int main(int argc, char const *argv[])
{
    ontime time = {0,0,0};
    char *text = get_data();
    char *list[50];
    int num = cut_text(text,list);
    showsong(list);
    jay *head = songword(num,list);
    free(text);
    showtime(time);
    showsongtxt(head,NULL);
    mplayer_play("./music/简单爱.mp3");
    jay *pd = head;
    int t = 0;
    while(1)
    {
    int m = t / 60;
    int s = t % 60;
    time.m = m;
    time.s = s;
    showtime(time);
    pd = findspot(head,t);
        if (pd != NULL)
        {
            showsong(list);
            showtime(time);
            jay *h = findstartspot(pd);
            showsongtxt(h,pd);
            if (pd -> n == NULL)
            {
                break;
            }
        }
        sleep(1);
//时间+1
        t++;
    }
    free_link(head);//释放链表
    cusor_show();//显示光标
    return 0;
}

2.lrc.c文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "./pos/console.h"
#include "lrc.h"
char *get_data()
{
    FILE *f = fopen("./text/简单爱.lrc", "r");
    if (f == NULL)
    {
        printf("文件打开失败\n");
        return NULL;
    }
    fseek(f, 0, SEEK_END);
    long len = ftell(f);
    rewind(f);
    char *lrc = malloc(len + 1);
    fread(lrc, len, 1, f);
    fclose(f);
    return lrc;
}
int cut_text(char *str, char *list[])
{
    int i = 0;
    list[i] = strtok(str, "\r\n");
    // printf("%s\n",list[i]);
    while (1)
    {
        list[++i] = strtok(NULL, "\r\n");
        if (list[i] == NULL)
        {
            break;
        }
    }
    return i;
}
void showsong(char *list[])
{
    clear_screen();
    cusor_hide();
    char buf[4][50];
    for (int i = 0; i < 4; i++)
    {
        cusor_moveto(40, i + 1); // 光标移到 第0行,第40列
        set_fg_color(COLOR_RED);
        sscanf(list[i], "%*4c%[^]]", buf[i]);
        // printf("%s\n",buf[i]);
    }
}
jay *songword(int num, char *list[])
{
    jay *head = NULL, *newhead = NULL;
    int m, s, ms;
    int timespot[10];
    int timenums = 0;
    char *str;
    for (int i = 4; i < num; i++)
    {
        str = list[i];
        timenums = 0;
        while (*str == '[')
        {
            sscanf(str, "[%2d:%2d.%2d", &m, &s, &ms);
            timespot[timenums] = m * 60 + s;
            timenums++;
            str = str + 10;
        }

        for (int j = 0; j < timenums; j++)
        {
            newhead = malloc(sizeof(jay));
            newhead->time = timespot[j];
            strcpy(newhead->buf_num, str);
            newhead->n = NULL;
            if (head == NULL)
            {
                head = newhead;
                head->l = NULL;
                head->n = NULL;
            }
            else
            {
                jay *myh = head;
                while (newhead->time >= myh->time && myh->n != NULL)
                {
                    myh = myh->n;
                }
                if (myh->time > newhead->time)
                {
                    if (myh == head) // 当前myh为new的下一个节点或者是最后一个节点
                    {
                        newhead->l = NULL;
                        newhead->n = head;
                        head->l = newhead;
                        head = newhead;
                    }
                    else // 当前myh为中间节点
                    {
                        // myh->l = head;
                        // head->n = newhead;
                        // myh = newhead;
                        // newhead->n = newhead;
                        // myh->n = NULL;
                        jay *l = myh->l;
                        l->n = newhead;
                        newhead->l = l;
                        newhead->n = myh;
                        myh->l = newhead;
                    }
                }
                else // 当前myh为第一个节点
                {
                    newhead->l = myh;
                    myh->n = newhead;
                }
            }
        }
    }
    // jay * mmm = head;
    // while(mmm->n != NULL){
    //     printf("%d,%s\n",mmm->time,mmm->buf_num);
    //     mmm = mmm->n;
    // }
    return head;
}
void showtime(ontime time) // 展示时间
{
    char time_num[30];
    sprintf(time_num, "%2d:%2d.%2d", time.m, time.s, time.ms);
    color_pos_printf(time_num, 39, 5, COLOR_GREEN);
}
void showsongtxt(jay *start, jay *pd) // pd为记录的当前节点,start记录的是开始节点--获取歌词
{
    char time_txt[30];
    for (int i = 0; i < 5; i++)
    {
        if (start == pd)
        {
            color_pos_printf(start->buf_num, 30, 6 + i, COLOR_MAGENTA);
        }
        else
        {
            color_pos_printf(start->buf_num, 30, 6 + i, COLOR_YELLOW);
        }
        start = start->n;
    }
}

jay *findspot(jay *lrc, int time) // lrc为头节点,time为时间 --获取节点
{
    while (lrc != NULL)
    {
        if (lrc->time == time)
        {
            return lrc;
        }
        else
        {
            lrc = lrc->n;
        }
    }
    return NULL;
}
jay *findstartspot(jay *lrc) // 寻找开始节点,lrc记录当前节点
{
    // if(lrc->l == NULL)
    // {
    //    return lrc;
    // }
    // else if(lrc->l->l == NULL)
    // {
    //     return lrc->l;
    // }
    // else if(lrc->l->l->l == NULL)
    // {
    //     return lrc->l->l;
    // }
    // else if(lrc->l->l->l->l == NULL)
    // {
    //     return lrc->l->l->l;
    // }
    // else if(lrc->l->l->l->l->l == NULL)
    // {
    //     return lrc->l->l->l->l;
    // }
    if (lrc->l == NULL)
    {
        return lrc;
    }
    // 如果当前节点为第二个节点,那么第一个节点就是开始节点
    else if (lrc->l->l == NULL)
    {
        return lrc->l;
    }
    // 如果当前节点是最后一个节点,那么其上级的上级的上级的上级为开始节点
    else if (lrc->n == NULL)
    {
        return lrc->l->l->l->l;
    }
    // 如果当前节点为倒数第二个节点,那么其上级的上级的上级为开始节点
    else if (lrc->n->n == NULL)
    {
        return lrc->l->l->l;
    }
    // 如果当前节点为3~倒数第三个节点中的某个节点,返回当前节点的上级的上级为开
    else
    {
        return lrc->l->l;
    }
}

void color_pos_printf(char *str, int x, int y, int color)
{
    cusor_moveto(x, y);
    set_fg_color(color);
    printf("%s\n", str);
}
void free_link(jay *head)
{
    while (head != NULL)
    {
        if (head->n != NULL)
        {
            jay *myh = head->n;
            free(head);
            head = myh;
        }
        else
        {
            free(head);
            head = NULL;
        }
    }
}

3.lrc.h文件

#ifndef MY_LRC
#define MY_LRC
typedef struct time
{
    int m;
    int s;
    int ms;
}ontime;

typedef struct jaychou
{
    int time;
    char buf_num[50];
    struct jaychou *l;
    struct jaychou *n;
}jay;
extern char *get_data();
extern int cut_text(char *str,char *list[]);
extern void showsong(char *list[]) ;
extern jay *songword(int num,char *list[]);
extern void color_pos_printf(char *str,int x,int y ,int color);
extern void showtime(ontime time);
extern void showsongtxt(jay *start,jay *pd);
extern jay* findspot(jay *lrc,int time);
extern jay *findstartspot(jay *lrc);
#endif

4.makefile文件

EXEC = main;
OBJ = main.o lrc.o ./pos/console.o ./mplayer/start_mplayer.o;
FLAGS = -wall -g;
CC = gcc;
$(EXEC) :(OBJ)
$(CC) $(OBJ) -o $(EXEC) $(FLAGS);
%.o:%.c %.h
$(CC) -c $< -o $@
clear:
rm $(EXEC) *.o

提示;其他要用的的文件放在资源里面了

示例图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/132931.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023-11-11 LeetCode每日一题(情侣牵手)

2023-11-11每日一题 一、题目编号 765. 情侣牵手二、题目链接 点击跳转到题目位置 三、题目描述 n 对情侣坐在连续排列的 2n 个座位上&#xff0c;想要牵到对方的手。 人和座位由一个整数数组 row 表示&#xff0c;其中 row[i] 是坐在第 i 个座位上的人的 ID。情侣们按顺…

2023年03月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 运行下列程序,输出的结果是?( ) def wenhao(name = zhejiang): print(hello + name) wenhao

【JavaEE初阶】 TCP协议详细解析

文章目录 &#x1f332;TCP协议的概念&#x1f6a9;TCP协议段格式&#x1f6a9;TCP的特性 &#x1f333;TCP原理&#x1f6a9;确认应答机制&#xff08;安全机制&#xff09;&#x1f6a9;超时重传机制&#xff08;安全机制&#xff09;&#x1f6a9;三次握手四次挥手&#xff…

软件测试需要学习什么?好学吗?需要学多久?到底是报班好还是自学好?

前言&#xff1a; 我发现很多的小伙伴刚刚毕业和想转行的小伙伴对于软件测试很陌生&#xff0c;其中很有很多的小伙伴还踩不少的坑&#xff0c;花费了大量的精力和时间去探索&#xff0c;结果还是一无所获。这里给大家出一期关于软件测试萌新的疑惑&#xff0c;看完这篇文章你就…

pytorch中对nn.BatchNorm2d()函数的理解

pytorch中对BatchNorm2d函数的理解 简介计算3. Pytorch的nn.BatchNorm2d()函数4 代码示例 简介 机器学习中&#xff0c;进行模型训练之前&#xff0c;需对数据做归一化处理&#xff0c;使其分布一致。在深度神经网络训练过程中&#xff0c;通常一次训练是一个batch&#xff0c…

SPSS:卡方检验(交叉表)

第一步 打开SPSS软件&#xff0c;在工具栏中选中【打开-文件-数据】&#xff0c;然后选择一份要打开的数据表(如图所示)。 第二步 在工具栏中找到【分析-描述统计-交叉表】打开交叉表对话框(如图所示)。 第三步 接着将【行-列】相关变量放在对应对话框中(如图所示)。 第四步 在…

web3 React Dapp书写订单 买入/取消操作

好 上文web3 前端dapp从redux过滤出 (我创建与别人创建&#xff09;正在执行的订单 并展示在Table上中 我们过滤出了 我创建的 与 别人创建的 且 未完成 未取消的订单数据 这边 我们起一下 ganache 环境 ganache -d然后 我们项目 发布一下智能合约 truffle migrate --reset然…

C++ 常用方法,刷oj必备(持续更新!!!)

输出结果保留小数点后n位(4位) #include<iostream> #include <iomanip> using namespace std;int main(){double s ;cin >> s ;cout<<fixed << setprecision(4) << s ;return 0; } 类型转换 string 转 int #include <iostream> …

深度学习工具的安装 CUDA Anaconda

深度学习工具安装 CUDA与CUDNN的安装 查看计算机是否支持CUDA 主要参考: 一看就懂的 CUDA安装教程及Pytorch GPU版本安装教程 次要参考: cuda安装 &#xff08;windows版&#xff09; cuDNN的验证 Anaconda的包装 anaconda下载安装包国内镜像源

jenkins分步式构建环境(agent)

rootjenkins:~# netstat -antp|grep 50000 tcp6 0 0 :::50000 ::&#x1f617; LISTEN 5139/java 1.52 安装Jenkins rootubuntu20:~# dpkg -i jenkins_2.414.3_all.deb 配置各种类型的Agent的关键之处在于启动Agent的方式 ◼ JNLP Agent对应着“通过Java Web启动代理”这种方…

企业计算机中了mkp勒索病毒怎么办,服务器中了勒索病毒如何处理

计算机技术的不断发展给企业的生产生活提供了极大便利&#xff0c;但也为企业带来了网络安全威胁。近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的计算机服务器遭到了mkp勒索病毒攻击&#xff0c;导致企业的所有工作无法正常开展&#xff0c;给企业…

kubernetes etcd

目录 一、备份 二、回复 官网&#xff1a; https://v1-25.docs.kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/#restoring-an-etcd-cluster 一、备份 从镜像中拷贝etcdctl二进制命令 输入ctrlpq快捷键&#xff0c;把容器打入后台 docker run…

数据的属性与数据集,相似度,数据的质量,OLAP

数据的属性与数据集&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sq…

徒步“三色”泸溪 共赏冬日胜景

&#xff08;金笛 胡灵芝&#xff09;11月11日&#xff0c;“中国体育彩票”2023年“走红军走过的路”徒步穿越系列活动&#xff08;泸溪站&#xff09;暨泸溪文旅推荐活动在泸溪县举行&#xff0c;来自全国各地千余名户外爱好者通过徒步的方式&#xff0c;传承红色基因&#x…

C语言全部关键字解析

前言 C语言具有以下关键字&#xff1a; 这些关键字如下: 关键字autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile 对于这些关键字&#xff0c;大…

《RN移动开发实战》3出版了,文末抽奖

前言 众所周知&#xff0c;传統的原生Android、iOS开发技术虽然比较成熟&#xff0c;但是多端重复开发的成本和开发效率的低下也是很多企业不愿意看到的&#xff0c;而不断崛起的跨平台技术让企业看到了曙光&#xff0c;“一次编写&#xff0c;处处运行”也不再是难以企及的目…

代码随想录算法训练营第四十六天|139. 单词拆分、多重背包问题、总结

第九章 动态规划part08 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 关于字符串类型的题目还是…

大数据治理——为业务提供持续的、可度量的价值(二)

第二部分&#xff1a;元数据集成体系结构 在明确了元数据管理策略后需要确定实现该管理策略所需的技术体系结构&#xff0c;即元数据集成体系结构。元数据集成体系结构涉及到多个概念&#xff0c;如元模型、元-元模型、公共仓库元模型&#xff08;CWM&#xff09;等&#xff0…

Shopee活动取消规则是什么?shopee官方促销活动怎么取消?

作为一家知名的电商平台&#xff0c;shopee官方对于消费者取消促销活动的请求给予了相应的规定和处理流程。 shopee活动取消规则是什么&#xff1f; 首先&#xff0c;消费者应该明确了解虾皮的促销活动取消规则。根据虾皮的官方规定&#xff0c;消费者在参与促销活动之前&…

win环境Jenkins高级配置各种插件和启动jar包

今天分享Jenkins高级配置各种插件&#xff0c;在看此篇之前必须先了解上一篇博客内容&#xff0c;因为此篇是在上篇的基础上完善的&#xff1a; 一、git仓库的多分支选择 想要多分支选择部署&#xff0c;需要全局安装Git parameter 插件 1、点击入口 来到 2、点击进入 安装一…