MFC VS2010 读取txt中数据并显示

需要读取的数据格式如下:有两列,第一列为心电数据,第二列为脉搏波数据

首先设定要读取的行数N=5000,以及定义一个动态数组CArray <CPoint,CPoint> m_PointArray;  之前在VC6.0中写的代码如下:

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<N;i++)
	   {
			File.ReadString(FileData);
			sscanf(FileData,"%s %s",TempStr1,TempStr2);
			m_PointArray.Add(CPoint(atoi(TempStr1),atoi(TempStr2)));
			//将其存入坐标点数组
	   }
	}
	
	m_skim.EnableWindow(TRUE); //显示键可用

}

通过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;i<N;i++)
	   {
			File.ReadString(FileData);
			_stscanf_s(FileData, _T("%s%s"), TempStr1, _countof(TempStr1), TempStr2, _countof(TempStr2));
			int x=atoi(TCHAR2char(TempStr1));//ecg data
			int y=atoi(TCHAR2char(TempStr2));//ppg data
			m_PointArray.Add(CPoint(x,y));
			if(x>max_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;i<N-1;i++)
       {
		    pDC->MoveTo(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;i<N-1;i++)
       {
		    pDC->MoveTo(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();
}





猜你喜欢

转载自blog.csdn.net/qq_21905401/article/details/53760455