C语言技术报告
班级:
学号:
姓名:
项目说明:
1、本程序在 VC环境下调试成功
    环境:需安装千千静听到默认路径下,同时安装vc6.0环境
2、本程序完成功能:
    完成LRC格式歌词的文件读取、解析、结构体创建等,
    同时在屏幕上将解析出的歌词进行实时显示
基本功能实现
1、读取文件,能正确打印到屏幕上。
2、切割字符串,正确存到一个结构体数组中。
3、能正确判断歌曲的歌名与演唱者,并打印出来。
4、实现模拟时钟的功能。
5、按顺序将歌词输出。
6、能滚动显示歌词。
7、能与时间匹配突出显示歌词的颜。
项目流程:
1、首先将歌词文件内容 通过fopen全部读到一个数组song_word[][]中,然后将歌词内容保存到数组song_word1[][]
2、通过函数message_song1()判断歌曲的歌名与演唱者,并打印出前4行的歌曲信息。
3、用函数message_song2()strtok将同一行的歌词和时间一一对应的进行切割,并分别保存在数组lyric[][]time[][]中,并通过Sleep1000)将时间标签转换为以s为单位的模拟时钟。
4、在每一秒内对将时钟的时间与歌词前面的时间相比较,如果相等那么就输出当前时间后面的歌词,实现了歌词与时间的同步显示。
5、歌词的前5行依次输出,当歌词大于5行时,用函数MoveText(22,6,20,5,22,5);实现将歌词整块移动并每次显示5行。
7GoToXY(22,m)SetText_Color(2)实现将光标定位在当前行并且显示相应的颜,使已显示的歌词变为白,而刚出现的歌词变为相应的颜。
6、在主程序运行时即可启动千千静听
    ShellExecute( NULL, NULL, "",".\\LRC\\简单爱.mp3",NULL,1);       
代码:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include"console.h"
//跳转到光标指定位置
void GoToXY(int x,int y)
{
    HANDLE h1;
    COORD pos;
    pos.X=x;
    pos.Y=y;
    h1=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(h1,pos);
}
//屏幕整块移动
//参数:startxstarty:要移动的块的起始坐标
//      sizexsizey:块的大小
//        destxdesty: 目标坐标,即要移动到得位置
void MoveText(int startx, int starty, int sizex, int sizey, int destx, int desty)
{   
    SMALL_RECT rc = {startx, starty,startx+sizex, starty+sizey};
    COORD crDest = {destx, desty};
    CHAR_INFO chFill;
    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO bInfo;
    GetConsoleScreenBufferInfo(hout, &bInfo);
    chFill.Attributes = bInfo.wAttributes;
    chFill.Char.AsciiChar =' ';
    ScrollConsoleScreenBuffer(hout, &rc, NULL, crDest, &chFill);
}
/*
第一个值为背景,第二个值为前景:
0 =   8 =
1 =   9 = 淡蓝
2 = 绿  A = 淡绿
3 = 湖蓝 B = 淡浅绿
4 =   C = 淡红
5 =   D = 淡紫
6 =   E = 淡黄
7 =   F = 亮白
*/
//设置接下来终端显示文本的背景和文本颜
简单爱的歌词
void SetText_Color(int color)
{
    HANDLE hStdout;
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hStdout,color);
}
void message_song1(char song[4][100])//切割前四行
{
    int i;
    char delims[]="[:]";
    char *result=NULL;
    char *sign[4]={"歌名","歌手","制作","专辑"};
    for(i=0;i<4;i++)
        {
          strtok(song[i],delims);
            result= strtok(NULL,delims);
          printf("%s  %s\n",sign[i],result);
        }
    printf("\n\n");
   
}
void message_song2(char song1[100][100],char time[100][100] ,char lyric[100][100] )//切割歌词和时间
{
    int i,j,k1=0,k2=0,min=0,tsec=0,gsec=0,b=6;
    int flag=0,m=5;
    char delims1[]="[]";
    char *result1=NULL;
    for(j=0;song1[j][0]!='\0';j++)
    {
        result1=
        strtok(song1[j],delims1);
        for(i=0;result1!=NULL;i++)
        {   
            if(i%2==0)             
            {                 
            strcpy(time[k1],result1);   
            result1=strtok(NULL,delims1);
            k1++;
            }
            if(i%2==1)               
            {
            strcpy(lyric[k2],result1);
            result1=strtok(NULL,delims1);
            k2++;
            }   
        }
    }   
    j=0;
    for(i=0;;i++)
    {   
        GoToXY(22,5);
        printf("The time is:0%d:%d%d    ",min,tsec,gsec);
        Sleep(1000);
        gsec++;
        if(gsec==10)
            {
            tsec++;
            gsec=0;
            }
        if(tsec==6)
            {
              min++;
              tsec=0;
            }
   
      for(j=0;j<50;j++)
      { 
            if((min==time[j][1]-48)&&(tsec==time[j][3]-48)&&(gsec==time[j][4]-48))
            { 
                if(m<10) m+=1;
                else    m=10;
                GoToXY(22,m);
                SetText_Color(2);
                printf("%s\t\t\t\t\n",lyric[j-1]);
               
                GoToXY(22,m-1);
                SetText_Color(7);
                printf("%s\t\t\t\t\n",lyric[j-2]);
               
                flag++;
                if(flag>=5)   
                MoveText(22,6,20,5,22,5);   
            }
      }
}
}
   
void main()
    FILE*fp;
    int i=0;
    char time[100][100]={0};
    char lyric[100][100]={0};
    char infile[1000]={0},song_word[100][100]={0},song_word1[100][100]={0};