我用VC写了个在实验数据中寻找需要的数值,每个实验文件中有2034个数据,其中波长和强度值一一对应。主要代码如下: void CFindPeakDlg::OnBegin()
{
// TODO: Add your control notification handler code here CFileDialog openPre(true,"*.ROH",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
"待处理文件(*.ROH)|*.ROH|所有文件(*.*)|*.*||");
DWORD MAXFILE = 256000; //设置缓冲区,
openPre.m_ofn.nMaxFile = MAXFILE;
char* pc = new char[MAXFILE];
openPre.m_ofn.lpstrFile = pc;
openPre.m_ofn.lpstrFile[0]=NULL; int index1=0,x=0;//文件数量统计 if(openPre.DoModal()==IDOK)
{
//启动EXCEL服务器,设置初始属性
_Application app;
Workbooks books;
_Workbook book;
Sheets sheets;
_Worksheet sheet;
Range range;
LPDISPATCH lpDisp;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); //Create Excel server (start Excel)
if(!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("Can't start Excel server! ");
return;
}
app.SetVisible(TRUE); //set Excel visible
app.SetUserControl(TRUE); //user can operate Excel books=app.GetWorkbooks();
book=books.Add(covOptional);
sheets=book.GetSheets();
sheet=sheets.GetItem(COleVariant((short)1));
range.AttachDispatch(sheet.GetCells(),TRUE); POSITION posi= openPre.GetStartPosition();
CString sPath=""; m_Wavelength2=290.566;//定义需要寻找的数值的波长和通道;
m_Slaver2=2; while (posi!= NULL)
{
sPath=openPre.GetNextPathName(posi);//每次循环都得到下一个文件路径
FILE *fd=fopen(sPath,"rb");
float buf[2056];
fread(buf,sizeof(buf[0]),2056,fd);//读取二进制文件,放到buf数组中 float xbuf[2034];
float ybuf[2034];
for (int j=0;j <2034;j++)
{
xbuf[j]=buf[1]+buf[2]*j+buf[3]*j*j+buf[4]*j*j*j+buf[5]*j*j*j*j;//算出波长xbuf; ybuf[j]=buf[j+19];//与波长对应的强度值;
}
if (0!=m_Wavelength2)
{
if (m_Slaver2=2&&xbuf[1]>288&&xbuf[1] <292)
{
for (int k=0;k <2034;k++)
{
if ( fabs(xbuf[k]-m_Wavelength2) < 0.001) //波长与给定的相等;
{
x=++index1;
range.SetItem(_variant_t((long)(x)),_variant_t((long)1),_variant_t(ybuf[k]));
break;//把数值输出到EXCEL,并且跳出FOR循环,寻找下一个文件;
}
}
}
}
}
}
}
程序运行后,当寻找到64个文件时,程序就会出错。调试的时候,就会出现“Access Violation”.
{
// TODO: Add your control notification handler code here CFileDialog openPre(true,"*.ROH",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
"待处理文件(*.ROH)|*.ROH|所有文件(*.*)|*.*||");
DWORD MAXFILE = 256000; //设置缓冲区,
openPre.m_ofn.nMaxFile = MAXFILE;
char* pc = new char[MAXFILE];
openPre.m_ofn.lpstrFile = pc;
openPre.m_ofn.lpstrFile[0]=NULL; int index1=0,x=0;//文件数量统计 if(openPre.DoModal()==IDOK)
{
//启动EXCEL服务器,设置初始属性
_Application app;
Workbooks books;
_Workbook book;
Sheets sheets;
_Worksheet sheet;
Range range;
LPDISPATCH lpDisp;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); //Create Excel server (start Excel)
if(!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("Can't start Excel server! ");
return;
}
app.SetVisible(TRUE); //set Excel visible
app.SetUserControl(TRUE); //user can operate Excel books=app.GetWorkbooks();
book=books.Add(covOptional);
sheets=book.GetSheets();
sheet=sheets.GetItem(COleVariant((short)1));
range.AttachDispatch(sheet.GetCells(),TRUE); POSITION posi= openPre.GetStartPosition();
CString sPath=""; m_Wavelength2=290.566;//定义需要寻找的数值的波长和通道;
m_Slaver2=2; while (posi!= NULL)
{
sPath=openPre.GetNextPathName(posi);//每次循环都得到下一个文件路径
FILE *fd=fopen(sPath,"rb");
float buf[2056];
fread(buf,sizeof(buf[0]),2056,fd);//读取二进制文件,放到buf数组中 float xbuf[2034];
float ybuf[2034];
for (int j=0;j <2034;j++)
{
xbuf[j]=buf[1]+buf[2]*j+buf[3]*j*j+buf[4]*j*j*j+buf[5]*j*j*j*j;//算出波长xbuf; ybuf[j]=buf[j+19];//与波长对应的强度值;
}
if (0!=m_Wavelength2)
{
if (m_Slaver2=2&&xbuf[1]>288&&xbuf[1] <292)
{
for (int k=0;k <2034;k++)
{
if ( fabs(xbuf[k]-m_Wavelength2) < 0.001) //波长与给定的相等;
{
x=++index1;
range.SetItem(_variant_t((long)(x)),_variant_t((long)1),_variant_t(ybuf[k]));
break;//把数值输出到EXCEL,并且跳出FOR循环,寻找下一个文件;
}
}
}
}
}
}
}
程序运行后,当寻找到64个文件时,程序就会出错。调试的时候,就会出现“Access Violation”.
无语,你Debug调试一下看看哪里出错啊。