读取文件数据的编程出现的问题

来源:互联网 发布:js获取class属性值 编辑:程序博客网 时间:2024/06/13 04:52


// MyPro1Dlg.cpp : 实现文件
//

#include "stdafx.h"
#include "MyPro1.h"
#include "MyPro1Dlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
 CAboutDlg();

// 对话框数据
 enum { IDD = IDD_ABOUTBOX };

 protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
 DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CMyPro1Dlg 对话框

 


CMyPro1Dlg::CMyPro1Dlg(CWnd* pParent /*=NULL*/)
 : CDialogEx(CMyPro1Dlg::IDD, pParent)
{
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 b_out=NULL;
 c_out=NULL;
}

void CMyPro1Dlg::DoDataExchange(CDataExchange* pDX)
{
 CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMyPro1Dlg, CDialogEx)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_BN_CLICKED(IDC_BTNREADFILE, &CMyPro1Dlg::OnBnClickedBtnreadfile)
 ON_BN_CLICKED(IDC_BTNWRITEFILE, &CMyPro1Dlg::OnBnClickedBtnwritefile)
// ON_WM_CREATE()
END_MESSAGE_MAP()


// CMyPro1Dlg 消息处理程序

BOOL CMyPro1Dlg::OnInitDialog()
{
 CDialogEx::OnInitDialog();

 // 将“关于...”菜单项添加到系统菜单中。

 // IDM_ABOUTBOX 必须在系统命令范围内。
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  BOOL bNameValid;
  CString strAboutMenu;
  bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  ASSERT(bNameValid);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
 //  执行此操作
 SetIcon(m_hIcon, TRUE);   // 设置大图标
 SetIcon(m_hIcon, FALSE);  // 设置小图标

 // TODO: 在此添加额外的初始化代码

 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CMyPro1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
 {
  CAboutDlg dlgAbout;
  dlgAbout.DoModal();
 }
 else
 {
  CDialogEx::OnSysCommand(nID, lParam);
 }
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CMyPro1Dlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // 用于绘制的设备上下文

  SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  // 使图标在工作区矩形中居中
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // 绘制图标
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialogEx::OnPaint();
 }
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMyPro1Dlg::OnQueryDragIcon()
{
 return static_cast<HCURSOR>(m_hIcon);
}

 

void CMyPro1Dlg::OnBnClickedBtnreadfile()
{
 // TODO: 在此添加控件通知处理程序代码
 CFileDialog fileDlg(TRUE);
 fileDlg.m_ofn.lpstrFilter="Text Files(*.ori)\0*.ori\0All Files(*.*)\0*.*\0\0";
 if(IDOK==fileDlg.DoModal())
 {
  m_fileName=fileDlg.GetPathName();
 }  
     CFile file;//(m_fileName,CFile::modeRead) 错误1;  
  if(file.Open(m_fileName,CFile::modeRead,NULL)==NULL)
  {
     MessageBox(_T("读取文件错误"));
     return;
  }

  fileLength=file.GetLength();
  BYTE *pBuf;

  pBuf=new BYTE[fileLength+1];
  b_out=new short[fileLength+1];//错误2:不能把b_out,c_out声明为char型,否则后面的数据转换会有问题;
  c_out=new short[fileLength+1];//char只有一个字节,而int为四个字节(大小转换问题)

  memset(b_out,0,fileLength+1);//初始化数组
  memset(c_out,0,fileLength+1);
  pBuf[fileLength]=0;     

  t_length=int((fileLength-1024))/512;//计算数据读取时间

        if(!m_progress.m_hWnd)
  {
   m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,CRect(0,0,200,30),this,123);
         m_progress.SetRange(0,100);
  }
  else
   m_progress.MoveWindow(CRect(0,0,200,30));

  ProgressNumber=0;  
  file.Seek(1024,file.begin);//错误3:不能把这句话写在for循环内部,否则每次循环都在文件数据起始点开始
  
  for(int i=0;i<t_length;i++)
  {    
   ProgressNumber++;
      m_pos=100*(double(ProgressNumber)/double(t_length));
   m_progress.SetPos(m_pos);   

   file.Read(pBuf,512);
   //心电数据  
   for(int j=0;j<250;j++)
   { 
    int b_upper=0;
    int b_low=0;
    b_upper=(short)pBuf[j];
    if(j%2==0)
    {
     b_low=(short(pBuf[250+j/2]))%16;
    }
    else
    {
     b_low=(short(pBuf[250+j/2]))/16;
    }
    b_out[j+i*250]=b_upper*16+b_low;

   }
      
   //呼吸数据
   for(int j=0;j<25;j++)
   {
    int c_upper;
    int c_low=0;
    c_upper=pBuf[250+j];
    if(j%2==0)
    {
     c_low=(short(pBuf[400+j/2]))%16;
    }
    else
    {
     c_low=(short(pBuf[400+j/2]))/16;
    }
    c_out[j+250*i]=c_upper*16+c_low;    
   }   
  }
  file.Close();
  ProgressNumber=0;//一定要清零,否则在下面进行文件写入时会出现问题,
                   //double(ProgressNumber)/double(t_length)的比值大于1,导致m_pos>100
  
}


void CMyPro1Dlg::OnBnClickedBtnwritefile()
{
 // TODO: 在此添加控件通知处理程序代码
 CFileDialog fileDlg(FALSE);
 fileDlg.m_ofn.lpstrFilter="Text Files(*.csv)\0*.csv\0All Files(*.*)\0*.*\0\0";
 fileDlg.m_ofn.lpstrDefExt="csv";
 //CFileDialog dlg(TRUE,_T("txt"),_T("*.ori"),OFN_HIDEREADONLY | OFN_HIDEWRITEPROMPT,_T("文本文件(*.ori) |*.ori"));
 

 if(IDOK==fileDlg.DoModal())
 {     
  CStdioFile file(fileDlg.GetFileName(),CFile::modeCreate | CFile::modeWrite);//用于字符串的写入
  CString m_data;

  if(!m_progress.m_hWnd)
  {
   m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,CRect(0,0,200,30),this,123);
         m_progress.SetRange(0,100);
  }
  else
   m_progress.MoveWindow(CRect(0,0,200,30));//错误4:当时误将CRect的两个Y值弄成一样的了


  //写入心电数据
  for(int j=0;j<t_length;j++)
  {  
   
   ProgressNumber++;
      m_pos=100*(double(ProgressNumber)/double(t_length));
   m_progress.SetPos(m_pos);
   
   
   for (int i=1;i<251;i++)
   {
    if (i%16==0)
    {
     m_data.Format(_T("%d\n"),b_out[i-1+j*250]);
     file.WriteString(m_data);
    }
    else
    {
     m_data.Format(_T("%d,"),b_out[i-1+j*250]);
     file.WriteString(m_data);
    }    
   } 
   file.WriteString(_T("\n"));
   file.WriteString(_T("\n"));
  }
  file.WriteString(_T("\n"));
  file.WriteString(_T("呼吸数据"));
  file.WriteString(_T("\n"));  
        
        //写入呼吸数据 
  for(int j=0;j<t_length;j++)
  {
   for (int i=1;i<26;i++)
   {
    if (i%16==0)
    {
     m_data.Format(_T("%d\n"),c_out[i-1+25*j]);
     file.WriteString(m_data);
    }
    else
    {
     m_data.Format(_T("%d,"),c_out[i-1+25*j]);
     file.WriteString(m_data);     
    }    
   }
      file.WriteString(_T("\n"));
   file.WriteString(_T("\n"));
  }
  file.Close();
  m_progress.SetPos(100);
  }  
}


这个程序出现的问题在代码中都一一表明,关于char和int的类型转化问题,关于文件指针的位置,这两个问题调试了一晚上,在陈师兄帮助下解决了,还有一个是关于CFile file()已经初始化,另外在file.open中设置了一遍,导致程序的失败。还有就是关于变量的清零,还有因为粗心导致的问题。

0 0
原创粉丝点击