求助啊,关于stream!=NULL的问题

ckztms 2010-07-31 09:34:37
单击菜单按钮plot,我把aaa.dat文件中的数据读取出来,然后在view中画图,再接着单击save按钮,弹出对话框保存所画的图形,保存完后我再次单击plot读取数据画图时,出现错误:
File:fscanf.c
Line:54

Expression: stream!=NULL
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the appliction)

读取文件的代码如下:
CString filename;
FILE *fp;
int i,j;

filename=".\\data\\aaa.DAT";
fp=fopen(filename,"r");
if(!fp)
MessageBox("打开文件错误!");


if( fp != NULL )
{
for(i=0;i<349;i++)
for(j=0;j<550;j++)
{
fscanf(fp,"%f",&Ex[i][j]);
}

fclose(fp);
}

第一次读取数据画图时,没有问题,将图形保存后,再次画图读取数据就有问题,会弹出对话框“打开文件错误”!请问下该怎么解决这个问题啊?
...全文
1124 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
战在春秋 2010-08-20
再次读取的文件是之前保存的文件吗?二者有关系么?
  • 打赏
  • 举报
回复
ckztms 2010-08-01
看了下,第一次读取完数据关闭后确实是对的,fclose返回值是0;另外第一次读完数据后可以随便点击多少次画图都是可以的,主要是保存完view中画的图形后再次打开文件就开始出错,这个跟保存有关系吗?
  • 打赏
  • 举报
回复
shihaojie1219 2010-08-01
[Quote=引用 6 楼 ckztms 的回复:]

看了下,第一次读取完数据关闭后确实是对的,fclose返回值是0;另外第一次读完数据后可以随便点击多少次画图都是可以的,主要是保存完view中画的图形后再次打开文件就开始出错,这个跟保存有关系吗?
[/Quote]
----------------------
你把保存的代码注释掉,看看点两次读取数据有没有问题不就知道与保存代码有没有关系了。。
  • 打赏
  • 举报
回复
ckztms 2010-08-01
帮个忙啊,快崩溃了,比较着急用的。。。
  • 打赏
  • 举报
回复
shihaojie1219 2010-07-31
估计是fscanf(fp,"%f",&Ex[i][j]);读取数据这有问题,你断点调试下看看第一次读完数据有没有执行关闭文件。
  • 打赏
  • 举报
回复
ckztms 2010-07-31
放到外面了,还是有同样的错误。为什么第一次读取数据进行处理的时候没有错误,就算多点几次画图也总是没问题的,我根据读取的数据都能画出图来。倒是当运行保存后,保存完毕后再次读取文件就出错,跟保存对话框功能有关吗?
  • 打赏
  • 举报
回复
shihaojie1219 2010-07-31
这样啊,那与save没关系。你把fclose(fp);放到if外边看看。
  • 打赏
  • 举报
回复
ckztms 2010-07-31
保存代码如下:

void CLastView::OnFileSave()
{
// TODO: Add your command handler code here
CDC* pDC = GetWindowDC();
CBitmap bitmap;
CDC memDC ;
CRect rect;
GetWindowRect(rect);
memDC.CreateCompatibleDC(pDC);

bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
memDC.SelectObject(&bitmap);
memDC.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);

CFileDialog Dlg(FALSE,_T("bmp"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("位图文件|*.bmp"),this);

if (Dlg.DoModal()==IDOK)
{

CString bmpfile=Dlg.GetPathName();

CFile file(bmpfile,CFile::modeCreate|CFile::modeWrite);

BITMAP bInfo;
bitmap.GetBitmap(&bInfo);

//计算调色板大小
int panelsize = 0;
if (bInfo.bmBitsPixel<24) //非真彩色
{
panelsize = pow((double)2,bInfo.bmBitsPixel)*sizeof(RGBQUAD);
}

//定义位图信息
BITMAPINFO* bMapInfo = (BITMAPINFO*)LocalAlloc(LPTR,sizeof(BITMAPINFO)+panelsize);
bMapInfo->bmiHeader.biBitCount = bInfo.bmBitsPixel;
bMapInfo->bmiHeader.biClrImportant = 0;
bMapInfo->bmiHeader.biCompression = 0;
bMapInfo->bmiHeader.biHeight = bInfo.bmHeight;
bMapInfo->bmiHeader.biPlanes = bInfo.bmPlanes;
bMapInfo->bmiHeader.biSize = sizeof(BITMAPINFO);
bMapInfo->bmiHeader.biSizeImage = bInfo.bmHeight*bInfo.bmWidthBytes;
bMapInfo->bmiHeader.biWidth = bInfo.bmWidth;
bMapInfo->bmiHeader.biXPelsPerMeter = 0;
bMapInfo->bmiHeader.biYPelsPerMeter = 0;

//获取位图的实际数据
char* pData = new char[bMapInfo->bmiHeader.biSizeImage];
int len = GetDIBits(pDC->m_hDC,bitmap,0,bInfo.bmHeight,pData,bMapInfo,DIB_RGB_COLORS);

BITMAPFILEHEADER bFileHeader;
bFileHeader.bfType = 0x4D42;
bFileHeader.bfReserved1 = 0;
bFileHeader.bfReserved2 = 0;
bFileHeader.bfSize = sizeof(BITMAPFILEHEADER);
bFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+panelsize;

//向文件中写入位图数据
file.Write(&bFileHeader,sizeof(BITMAPFILEHEADER));
file.Write(&bMapInfo->bmiHeader,sizeof(BITMAPINFOHEADER));
file.Write(pData,bMapInfo->bmiHeader.biSizeImage+panelsize);
file.Close();
delete pData;
LocalFree(bMapInfo);
}
bitmap.DeleteObject();
memDC.DeleteDC();
}
  • 打赏
  • 举报
回复
shihaojie1219 2010-07-31
是不是文件没有正确关闭或者保存有问题?保存的代码呢
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
帖子事件
创建了帖子
2010-07-31 09:34
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……