C 语言_解析 lrc 格式的歌词文件

评价:
4
(1用户)
/*
    将时间和方括号去掉, 其余内容全部打印
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct lrc
{
    int time;
    char song[200];

    struct lrc *next;
} LRC;

/**
 * @brief  将歌词文件插入到链表
 * @param  ppNodeLRC: 歌词
 * @param  midtime: 时间
 * @retval None
 */
void HeadInsertLRCNode(LRC **ppNodeLRC, int midtime)
{
    LRC *pMidLRC = (LRC *)malloc(sizeof(LRC));
    pMidLRC->time = midtime;
    memset(pMidLRC->song, 0, sizeof(pMidLRC->song));

    if (*ppNodeLRC == NULL)
    {
        pMidLRC->next = NULL;
        *ppNodeLRC = pMidLRC;
    }
    else
    {
        pMidLRC->next = *ppNodeLRC;
        *ppNodeLRC = pMidLRC;
    }
}

/**
 * @brief  将歌词按时间排序
 * @param  pNode: 保存歌词的链表
 * @retval None
 */
void SortTimeNodeLink(LRC *pNode)
{
    int cnt = 0;
    int midtime = 0;
    char midsong[200] = {0};
    LRC *pMidNode = pNode;

    if (pNode != NULL)
    {
        if (pNode->next != NULL)
        {
            while (pNode != NULL)
            {
                cnt++;
                pNode = pNode->next;
            }

            for (int i = 0; i < (cnt - 1); i++)
            {
                pNode = pMidNode;

                for (int j = 0; j < (cnt - i - 1); j++)
                {
                    if (pNode->time > pNode->next->time)
                    {
                        midtime = pNode->time;
                        strcpy(midsong, pNode->song);
                        pNode->time = pNode->next->time;
                        strcpy(pNode->song, pNode->next->song);
                        pNode->next->time = midtime;
                        strcpy(pNode->next->song, midsong);
                    }

                    pNode = pNode->next;
                }
            }
        }
    }
}

/**
 * @brief  打印歌词
 * @param  pNode: 保存歌词的链表
 * @retval None
 */
void Print_Link(LRC *pNode)
{
    while (pNode != NULL)
    {
        printf("%s\n", (*pNode).song);
        pNode = pNode->next;
    }

    printf("LRC is already printed\n");
}

/**
 * @brief  释放链表
 * @param  pNode: 被释放的链表
 * @retval None
 */
void Free_Link(LRC *pNode)
{
    while (pNode != NULL)
    {
        free(pNode);
        pNode = pNode->next;
    }
}

int main()
{
    char al[100] = {0};   //  专辑
    char ar[100] = {0};   //  歌手
    char by[100] = {0};   //  作词
    char ti[100] = {0};   //  歌曲名
    LRC *pHeadLRC = NULL; //  保存歌词文件
    LRC *pCopyLRC = NULL;
    char LrcStr[200] = {0}; //  歌词
    char *PLrcStr = LrcStr;

    FILE *lrc_fp = fopen("./test.lrc", "r+");

    if (NULL == lrc_fp)
    {
        perror("main_fopen01");
        return -1;
    }
    else
    {
        /*
            从 fp 指向的文件中读取一行不超过 200 字节的数据,
            直到读取到文件末尾
        */
        while (NULL != fgets(LrcStr, 200, lrc_fp))
        {
            int min = 0; //  分
            int sec = 0; //  秒

            if (sscanf(PLrcStr, "[ti:%s", ti)) //  拿取文件内容, 存入到 ti 数组
            {
                int i = 0;

                while (*(ti + i) != ']')
                {
                    i++;
                }

                *(ti + i) = 0;
            }

            if (sscanf(PLrcStr, "[ar:%s", ar))
            {
                int i = 0;

                while (*(ar + i) != ']')
                {
                    i++;
                }

                *(ar + i) = '\0';
            }

            if (sscanf(PLrcStr, "[al:%s", al))
            {
                int i = 0;

                while (*(al + i) != ']')
                {
                    i++;
                }

                *(al + i) = '\0';
            }

            if (sscanf(PLrcStr, "[by:%s", by))
            {
                int i = 0;

                while (*(by + i) != ']')
                {
                    i++;
                }

                *(by + i) = '\0';
            }

            while (2 == sscanf(PLrcStr, "[%d:%d", &min, &sec)) //  获得歌词时间
            {
                HeadInsertLRCNode(&pHeadLRC, min * 60 + sec);
                PLrcStr = PLrcStr + 10;
            }

            if (pCopyLRC != pHeadLRC)
            {
                pCopyLRC = pHeadLRC;

                while (pCopyLRC != NULL)
                {
                    if (pCopyLRC->song[0] == 0)
                    {
                        strcpy(pCopyLRC->song, PLrcStr);
                    }
                    else
                    {
                        break;
                    }

                    pCopyLRC = pCopyLRC->next;
                }
            }

            pCopyLRC = pHeadLRC;
            PLrcStr = LrcStr;
            memset(LrcStr, 0, sizeof(LrcStr));
        }

        fclose(lrc_fp);

        SortTimeNodeLink(pHeadLRC);

        printf("Song:     %s\n", ti);
        printf("Singer:   %s\n", ar);
        printf("album:    %s\n", al);
        printf("lyricist: %s\n", by);

        LRC *p = pHeadLRC;

        Print_Link(pHeadLRC);
        Free_Link(pHeadLRC);

        pHeadLRC = NULL;
    }

    return 0;
}

 

本文为原创文章,转载请注明出处!

注册并通过认证的用户才可以进行评价!

admin:系统自动奖励,+10,  

发表评论