43 123
发新话题
打印

[C] [最新修改]通用LRC读取程序

本主题由 KingsamChen 于 2008-9-27 17:20 解除置顶

[最新修改]通用LRC读取程序

做了个通用版本的
设置了一下 :右键解决方案->属性->常规->使用多字节字符集
改过一以后烦人的”不能将参数 2 从 CString 转换为“const char *“的问题解决了 但是界面变得好丑陋了
下面开源,首先是读取时间标签和记录歌词部分:
复制内容到剪贴板
代码:
void C歌词显示Dlg::OnBnClickedButton1()
{
        FILE *fp;
    char *cRowLrc=new char[255];
        char cCh;
        char cCh1;
        int nLrcTime = 0, nCount = 0, nPFirst = 0,nPFirst1=0,nRowLrc=0,nTimeCount=0,i=0;
    bool bTimeTrue=true,bGoFind=true;
        pLrcFirst = pLrcNext = (PLRC)malloc(LENLRC);
        pTimeFirst = pTimeNext = (PTIME)malloc(LENTIME);
        pHeadTime=NULL;
        pHeadLrc=NULL;
        nSec=0;
        if((fp = fopen(cLrcPath, "r"))!=NULL){
                cCh = fgetc(fp);
                while (!feof(fp)){
                        cCh1=fgetc(fp);
                        while(bGoFind==true){
                                cCh=cCh1;
                                cCh1= fgetc(fp);
                                while (cCh != ']'){
                                        if (bTimeTrue==true){
                                                nCount = nCount + 1;
                                                switch (nCount){
case 1:
        if(cCh >= '0' && cCh <= '9'){
                nLrcTime = ((cCh - '0') * 10 * 60) + nLrcTime;}
        else{bTimeTrue=false;}
        break;
case 2:if(cCh >= '0' && cCh <= '9'){
        nLrcTime = ((cCh - '0') * 60) + nLrcTime;}
           else{bTimeTrue=false;}
           break;
case 3:if(cCh!=':'){
        bTimeTrue=false;}
           break;
case 4:if(cCh >= '0' && cCh <= '9'){
        nLrcTime = ((cCh - '0') * 10) + nLrcTime;}
           else{bTimeTrue=false;}
           break;
case 5:if(cCh >= '0' && cCh <= '9'){
        nLrcTime = (cCh - '0') + nLrcTime;}
           else{bTimeTrue=false;}
           break;
                                                }
                                        }
                                        cCh=cCh1;
                                        cCh1= fgetc(fp);
                                }
                                if (bTimeTrue==true){
                                        nTimeCount++;
                                        if(nPFirst==0){
                                                pTimeFirst -> nTime = nLrcTime;
                                                pHeadTime = pTimeFirst;
                                                nPFirst=1;        
                                        }
                                        else{
                                                pTimeNext->pTimeSelf =pTimeFirst;
                                                pTimeNext = pTimeFirst;
                                                pTimeFirst = (PTIME)malloc(LENTIME);
                                                pTimeFirst->nTime = nLrcTime;
                                        }
                                }
                                nCount = 0;
                                nLrcTime=0;
                                if(cCh1!='['){
                                        bGoFind=false;}
                                else{
                                        cCh=cCh1;
                                        cCh1 = fgetc(fp);
                                }
                        }
                        cCh=cCh1;
                        cCh1 = fgetc(fp);
                        while (cCh != '\n'){
                                if (bTimeTrue==true){
                                        *cRowLrc = cCh;
                                        cRowLrc++;
                                        nRowLrc++;
                                }
                                if(cCh1!=EOF){
                                        cCh=cCh1;
                                        cCh1 = fgetc(fp);
                                }
                                else{
                                        cCh=cCh1;
                                        break;
                                }
                        }
                        if(bTimeTrue==true){
                                *cRowLrc = '\0';
                                for(i=1;i<=nTimeCount;i++){
                                        if(nPFirst1==0){
                                                pLrcFirst->cLrc = cRowLrc-nRowLrc;
                                                pHeadLrc = pLrcFirst;
                                                nPFirst1=1;
                                        }
                                        else{
                                                pLrcNext->pLrcSelf = pLrcFirst;
                                                pLrcNext = pLrcFirst;
                                                pLrcFirst = (PLRC)malloc(LENLRC);
                                                pLrcFirst->cLrc = cRowLrc-nRowLrc;
                                        }
                                }
                                cRowLrc=cRowLrc-nRowLrc;
                                cRowLrc=new char[255];
                                nRowLrc=0;   
                                nTimeCount=0;
                                i=0;
                        }        
                        cCh=cCh1;
                        bTimeTrue=true;
                        bGoFind=true;
                }
}  
else{
        m_Lrc="file failed";
        UpdateData(false);
}
fclose(fp);
pLrcNext->pLrcSelf = pLrcFirst;
pTimeNext->pTimeSelf =pTimeFirst;
pLrcNext = pLrcFirst;
pTimeNext = pTimeFirst;
pTimeNext->pTimeSelf = NULL;
pLrcNext->pLrcSelf = NULL;
SetTimer(1,1000,NULL);
}
接着是显示歌词部分:
复制内容到剪贴板
代码:
void C歌词显示Dlg::OnTimer(UINT_PTR nIDEvent)
{
    if(nIDEvent==1){
       nSec++;
          pLrcOut=pHeadLrc;
          pTimeOut=pHeadTime;
          while(pLrcOut!=NULL){
       if(pTimeOut -> nTime == nSec){
           m_Lrc=pLrcOut->cLrc;
           UpdateData(false);
       }
           pLrcOut=pLrcOut->pLrcSelf;
           pTimeOut=pTimeOut->pTimeSelf;
         }
   }
    return;
    CDialog::OnTimer(nIDEvent);
}
选择文件部分:
复制内容到剪贴板
代码:
void C歌词显示Dlg::OnBnClickedButton2()
{
   CFileDialog LrcFile(TRUE);
   LrcFile.DoModal();
   cLrcPath="";
   cLrcPath=LrcFile.GetPathName();
   return;
}
[ 本帖最后由 Sruing1.0 于 2008-9-17 22:40 编辑 ]
附件: 您所在的用户组无法下载或查看附件
本帖最近评分记录
  • at.Least 现金 +10 唉 老了~ 评分范围都小了 2008-8-22 18:04
  • KingsamChen 现金 +20 感谢分享,加分鼓励 2008-8-21 22:17
举世誉我而不加劝 举世非我而不加沮
http://hi.baidu.com/sruingking

TOP

对于VC++,C语言里传统的结构声明是不能用的
MS可以吧,MS我记得以前可以的。具体不知道~:)干吗不直接写成Class?感觉Struct就是一个阉割的Class……:s021:
至于那个声明需要static的问题,可能是声明方式的问题
基本上声名变量我都通过Wizard的,自己去添加会有点麻烦~
不过如果能指定目标LRC文件就好了~呵呵~:s017:

TOP

提个建议~
Sruing能不能以后发布别用Debug的……
我这里缺乏相关的DLL
Release的XP内置,但是Debug没有的~

TOP

回复 2楼 的帖子

开学的时候就搞个通用的
本帖最近评分记录
  • KingsamChen 现金 +20 恭喜成为8月优秀帖子 2008-9-12 21:35
举世誉我而不加劝 举世非我而不加沮
http://hi.baidu.com/sruingking

TOP

回复 2楼 的帖子

习惯了 下次会注意的
举世誉我而不加劝 举世非我而不加沮
http://hi.baidu.com/sruingking

TOP

回复 5楼 的帖子

嗯,好的,期待中~

TOP

看见炉子给我评分了  忽忽  好久不见炉子了
举世誉我而不加劝 举世非我而不加沮
http://hi.baidu.com/sruingking

TOP

呵  好久不见了:)

今天上数学课走神了会儿,然后突然听到老师在讲2分法……
:s023:
0GiNr的炉子, 不多解释了.

有事请PM.

TOP

回复 8楼 的帖子

露露已经开学了?
这么快?
ps:二分法啊,这个东西好,不用计算器笔算更好

TOP

笔算 :s023: 寒一个
举世誉我而不加劝 举世非我而不加沮
http://hi.baidu.com/sruingking

TOP

---------------------------
歌词显示.exe - 无法找到组件
---------------------------
没有找到 MFC42D.DLL,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。
---------------------------
确定   
---------------------------

TOP

引用:
原帖由 KingsamChen 于 2008-8-21 10:18 PM 发表
对于VC++,C语言里传统的结构声明是不能用的
MS可以吧,MS我记得以前可以的。具体不知道~:)干吗不直接写成Class?感觉Struct就是一个阉割的Class……:s021:
至于那个声明需要static的问题,可能是声明方式的问题
...
c++的class和struct一样的
只是struct默认是public而class默认是private

TOP

回复 11楼 的帖子

Debug的 有那个DLL文件就能用了 下次我会注意的
举世誉我而不加劝 举世非我而不加沮
http://hi.baidu.com/sruingking

TOP

dl了两个dll,然后
---------------------------
歌词显示.exe - 找不到序数
---------------------------
无法定位序数 5077 于动态链接库 MFC42D.DLL 上。
---------------------------
确定   
---------------------------
附件: 您所在的用户组无法下载或查看附件

TOP

回复 12楼 的帖子

C++的Struct还能继承啊……

TOP

 43 123
发新话题