读取文件数据的编程出现的问题
来源:互联网 发布: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中设置了一遍,导致程序的失败。还有就是关于变量的清零,还有因为粗心导致的问题。
- 读取文件数据的编程出现的问题
- ifstream 文件流读取格式数据出现的问题
- QT读取文件出现乱码的问题
- C#编程读取Excel文件,引用Microsoft.Office.Interop.Excel出现的问题
- 转:C#编程读取Excel文件,引用Microsoft.Office.Interop.Excel出现的问题
- iphone读取文件的时候出现的问题
- PHP读取MSSQL数据出现乱码的问题
- IIC读取AT24C256数据出现的问题及解析
- 读取文件时出现中文乱码问题的解决
- CFile读取文件时末尾出现乱码的问题
- CFile读取文件时末尾出现乱码的问题
- python读取文件处理网页粘贴代码出现的问题
- 解决读取txt文件前面出现字符的问题
- smb远程读取共享文件出现的问题
- 编程出现的问题
- 读取文件的问题
- 读取文件的问题
- 使用ifstream读取文件的数据不完整的问题
- Tomcat7+Apache2集群配置
- 安装GDB调试c语言
- FGPA实现串转并,同时对数据打包的模块
- 防止自己制作的光盘被其他用户复制的办法
- Oracle Database 11g: 面向 DBA 和开发人员的重要新特性 - PL/SQL 性能
- 读取文件数据的编程出现的问题
- emacs操作
- android通过base64encode方式发送图片到服务端
- Windows XP 自带分区工具的使用办法
- 简介各个电商网站特点成功点
- css经典问题
- NSAttributedString使一个字符串显示的多样化
- 分析三星的uboot中的fdisk功能
- GHOST装系统时出现A:\GHOSTERR.TXT错误提示分析及解决办法