需要读取的数据格式如下:有两列,第一列为心电数据,第二列为脉搏波数据
首先设定要读取的行数N=5000,以及定义一个动态数组CArray
void CDemoDlg::OnBnClickedButton1Open()
{
// TODO: Add your control notification handler code here
char szFilters[]="数据文件(*.txt)|*.txt|所有文件(*.*)|*.*||";
CFileDialog dlg(TRUE,"数据文件","*.txt",OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,szFilters);
CString m_FilePath;
if(dlg.DoModal()==IDOK)
{
m_PointArray.RemoveAll();//移除所有数据
Invalidate(true);
UpdateWindow();
m_FilePath = dlg.GetPathName();//取得文件路径及文件名
CStdioFile File;
File.Open(m_FilePath,CFile::modeRead);//以读模式打开文本文件
CString FileData; //定义一个CString变量作为缓冲区
/*定义两个临时字符串,并初始化为'\0'*/
char TempStr1[10];
char TempStr2[10];
memset(TempStr1,'\0',10);
memset(TempStr2,'\0',10);
/*逐行读取坐标数据*/
for (int i = 0;i
通过ReadString()读取一行的字符串,然后通过sscanf()函数将字符串分割到TempStr1、TempStr2中,上述代码在VC6.0中是可以运行通过的。在VS2010中运行编译出错,通过查找资料,修改代码如下:
void CDemoDlg::OnBnClickedButton1Open()
{
// TODO: 在此添加控件通知处理程序代码
CString szFilters=_T("数据文件(*.txt)|*.txt|所有文件(*.*)|*.*||");
CFileDialog dlg(TRUE,_T("数据文件"),_T("*.txt"),OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,szFilters,this);
CString m_FilePath;
if(dlg.DoModal()==IDOK)
{
m_PointArray.RemoveAll();//移除所有数据
Invalidate(true);
UpdateWindow();
m_FilePath = dlg.GetPathName();//取得文件路径及文件名
CStdioFile File;
File.Open(m_FilePath,CFile::modeRead);//以读模式打开文本文件
CString FileData; //定义一个CString变量作为缓冲区
TCHAR TempStr1[10]={0};
TCHAR TempStr2[10]={0};
max_x=max_y=0;
for (int i = 0;imax_x)
max_x=x;
if(y>max_y)
max_y=y;
}
File.Close();
}
UpdateData(FALSE);
//m_show.EnableWindow(TRUE); //显示键可用
}
使用_stscanf_s()函数,同时TemStr1、TemStr2类型修改为TCHAR。函数atoi()的参数类型是char,需要将TCHAR转变成char。在头文件public下添加函数char* TCHAR2char(TCHAR* tchStr) ; 在实现文件中,函数TCHAR2char()实现代码如下:
char* TCHAR2char(TCHAR* tchStr)
{
int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度
char* chRtn = new char[iLen+1] ;
wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值
return chRtn;
}
读取的数据保存在m_PointArray[]中(x为第一列数据,y为第二列数据)。在头文件public下添加用于画图的函数void Draw_ECG(),void Draw_PPG(); 在实现文件中,实现代码如下:
void CDemoDlg::Draw_ECG(int num)//画心电信号
{
CWnd* pWnd= GetDlgItem(IDC_SHOW1);;
CDC* pDC= pWnd->GetDC(); ;
CPen pen(PS_SOLID,1,RGB(0,0,255));
// 获取设备上下文
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->Rectangle(10, 10, 770, 140);
pDC->SelectObject(pen);
for (int i = 0;iMoveTo(i/7+10,120-(m_PointArray[i].x*120/(1.5*max_x)));
pDC->LineTo(i/7+10,120-(m_PointArray[i+1].x*120/(1.5*max_x)));
}
pen.DeleteObject();
}
void CDemoDlg::Draw_PPG()//画脉搏波信号
{
CWnd* pWnd= GetDlgItem(IDC_SHOW2);
CDC* pDC= pWnd->GetDC(); ;
CPen pen(PS_SOLID,1,RGB(0,0,255));
// 获取设备上下文
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->Rectangle(10, 10, 770, 140);
pDC->SelectObject(pen);
for (int i = 0;iMoveTo(i/7+10,140-(m_PointArray[i].y*120/max_y));
pDC->LineTo(i/7+10,140-(m_PointArray[i+1].y*120/max_y));
}
pen.DeleteObject();
}
在显示按钮下,添加如下实现代码:
void CDemoDlg::OnBnClickedButtonShow()
{
// TODO: 在此添加控件通知处理程序代码
Draw_ECG();
Draw_PPG();
}