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

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

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

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);
		}
	}
}

你可能感兴趣的:(ios,C++,String,File,delete,Path)