16,548
社区成员




typedef vector<vector<_line_info>> lineArr;
void CTestGuiDlg::OnBnClickedOk()
{
int _start = GetTickCount();
CFile _file;
_file.Open("C:\\test.txt",CFile::modeRead);
//文件长度;
int _len = _file.GetLength();
char* pdata = new char[_len+1];
char* presdata= new char[_len+1];
//读文件;
_file.Read(pdata,_len);
pdata[_len] = 0;
_file.Close();
lineArr _line_arr;
_line_arr.resize(100); //假设最多一行有10个'|'
int cnt = 0;
_line_info _info;
int _head_pos = 0;
for(int i = 0;i < _len;)
{
if(pdata[i] == '\r') //回车;
{
i += 2;
_info.pos = _head_pos; //这一行的起点;
_info.len = i - _head_pos; //这一行的长度;
_line_arr[cnt-1].push_back(_info);
_head_pos = i; //下一行起点;
cnt = 0; //'|'计数清0
continue;
}
else if(pdata[i] == '|')
++cnt;
++i;
}
/*
//这段是 57楼那位朋友的写入文件的程序
//写文件;
CFile _file2;
_file2.Open("C:\\test保存的结果.txt",CFile::modeWrite);
//遍历并且写文件;
for (lineArr::iterator it = _line_arr.begin();it != _line_arr.end();++it)
{
for (vector<_line_info>::iterator it2 = it->begin();it2 != it->end();++it2)
{
_file2.Write(pdata + it2->pos,it2->len);
}
}
*/
//下面这个是我修改的,一次性写入,速度快,不用频繁的写入。
char *ptem=presdata;
//遍历复制到结果缓存区;
for (lineArr::iterator it = _line_arr.begin();it != _line_arr.end();++it)
{
for (vector<_line_info>::iterator it2 = it->begin();it2 != it->end();++it2)
{
memcpy(ptem,pdata + it2->pos,it2->len);
ptem+=it2->len;
}
}
CFile _file2;
_file2.Open("C:\\test保存的结果.txt",CFile::modeCreate|CFile::modeWrite);
_file2.Write(presdata,_len+1);
_file2.Close();
delete[] pdata;
//消耗时间;
int _end = GetTickCount();
int _time = _end - _start;
char buf[16];
sprintf(buf,"消耗时间:%d 毫秒",_time);
MessageBox(buf);
}