C++读取歌词文件(LRC),分解时间和歌词的方法

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:38   2266   0

歌词文件的编码问题尤其须要注意!

主要用到两个函数,如下:

typedef struct _LYRIC
{
 long time;
 string strText;
}LYRIC,*LPLYRIC;
// 读取歌词文件
BOOL CLyricsDlg::ReadLyricsFile()
{
 m_bFileExist=TRUE;
 ly.clear();
 BOOL unicode=FALSE;
 //判断是否为unicode编码
 ifstream in(file,ios_base::in|ios_base::binary);
 byte b[2];
 in.read((char*)b,2);
 if((b[0]==0xFF)&&(b[1]==0xFE))
  unicode=TRUE;
 else
  unicode=FALSE;
 in.close();
 if(!unicode)
 {
  ifstream fin(file);
  char* p=new char[MAX_PATH];
  while(fin.getline(p,MAX_PATH))
  {
   string s;
   s.append(p);
   AnaliseString(s);
  }
  delete p;
  p=NULL;
  fin.close();
 }
 else
 {
  ifstream fin(file,ios_base::in|ios_base::binary);
  size_t index = 2;
  wstring ws;
  while (!fin.eof())
  {
   wchar_t wch;
   fin.read((char *)(&wch), 2);
   if (wch == 0x000D) // 判断回车
   {
    CUser u;
    string s;
    s=u.WstringToString(ws);
    AnaliseString(s);
    ws.erase(0, ws.size() + 1);
    index += 4; // 跳过回车符和行开头符
   }
   else
   {
    ws.append(1,wch);
    index += 2;
   }
  }
  fin.close();
 }
 LyricsSort();
 return TRUE;
}

// 分解出字符串中的时间和歌词语句
void CLyricsDlg::AnaliseString(string& str)
{
 if(str.empty())//空串,没意义返回
  return;
 int len=str.size();
 int index1=str.find_first_of('[');
 if(index1==-1)//过滤
  return;
 LYRIC temp;
 int index2=str.find_last_of(']');
 int index3=str.find_first_of(']');
 if(index2==index3)//只有一个[]
 {
  if(index2==(len-1))//[]后面没有文字,加上……
  {
   int n=str.find_first_of('.');
   if(n<0)//全是文字
   {
    int flag=str.find_first_of(':');
    if(flag==(index2-1))
     temp.strText="…… ……";
    else
     temp.strText=str.substr(flag+1,index2-flag-1);
    temp.time=0;
   }
   else//只有时间,没有歌词
   {
    temp.time=GetTime(str);
    temp.strText="…… ……";
   }
  }
  else//[]后面有歌词
  {
   temp.time=GetTime(str.substr(index1,index2-index1+1));
   temp.strText=str.substr(index3+1);
  }
  ly.push_back(temp);
 }
 else//有多个[]
 {
  string s1,s2;
  if(index2==(len-1))
  {
   s1=str;
   s2="…… ……";
  }
  else
  {
   s1=str.substr(index1,index2-index1+1);
   s2=str.substr(index2+1);
  }
  int pos1=0,pos2=0;
  while(true)//拆分
  {
   int flag1=s1.find('[',pos1);
   int flag2=s1.find(']',pos2);
   if(flag1<0||flag2<0)
    break;
   pos1=flag2+1;
   pos2=flag2+2;
   LYRIC temp;
   temp.time=GetTime(s1.substr(flag1,flag2-flag1+1));
   temp.strText=s2;
   ly.push_back(temp);
  }
 }
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP