歌词文件的编码问题尤其须要注意!
主要用到两个函数,如下:
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);
}
}
}
|