二进制文件读写问题

waitlife 2006-11-10 03:54:03
我已经成功地写入一个二进制文件,现在需要把它读出来,请教如何操作?
下面是我的代码,谢谢!
void CFileOperDlg::OnRead()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
BeginWaitCursor();
CFile m_File;
CString m_FilePath = _T("EnterMIS.cfg");
if(!m_File.Open(m_FilePath,CFile::modeRead|CFile::typeBinary))
{
EndWaitCursor();
AfxMessageBox(_T("打开文件出错"));
return;
}
try
{
m_File.SeekToBegin();
m_File.Read(&m_ConnInfo, sizeof(ConnInfo));
}
catch(...)
{
m_File.Close();
EndWaitCursor();
AfxMessageBox(_T("文件操作出错"));
return;
}
m_UserR = m_ConnInfo.strUser;
m_PasswordR = m_ConnInfo.strPassword;
m_DataBaseR = m_ConnInfo.strDataBase;
m_ServerR = m_ConnInfo.strServer;
EndWaitCursor();
UpdateData(FALSE);

}

void CFileOperDlg::OnWrite()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
BeginWaitCursor();
if(m_User.IsEmpty() || m_Password.IsEmpty() || m_Server.IsEmpty() || m_DataBase.IsEmpty())
{
EndWaitCursor();
AfxMessageBox(_T("对不起,信息不完整!"));
}

m_ConnInfo.strUser = m_User;
m_ConnInfo.strPassword = m_Password;
m_ConnInfo.strDataBase = m_DataBase;
m_ConnInfo.strServer = m_Server;

CFile m_File;
CString m_FilePath = _T("EnterMIS.cfg");
if(!m_File.Open(m_FilePath,CFile::modeCreate|CFile::modeReadWrite|CFile::typeBinary))
{
EndWaitCursor();
AfxMessageBox(_T("打开文件出错"));
return;
}
try
{
m_File.SeekToBegin();
m_File.Write(&m_ConnInfo,sizeof(m_ConnInfo));
}
catch(...)
{
m_File.Close();
EndWaitCursor();
AfxMessageBox(_T("文件操作出错"));
return;
}
EndWaitCursor();
}
上面代码已经成功写入,当点击写入之后,立即读出,则没有问题,但重新运行程序,只点读入的时候,出现无效的访问地址,DEBUG诊断时发现根本没有读入任何数据!
...全文
257 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2006-11-10
  • 打赏
  • 举报
回复
是啊,你CString s("12345678901234567890"),sizeof(CString)看看吧。
CString里面其实是一个char *指针,指向堆里的内存,那个内存里才存的"12345678901234567890"
waitlife 2006-11-10
  • 打赏
  • 举报
回复
不对,我写文件没有提示任何出错的!我看过,确实写文件成功!
taodm 2006-11-10
  • 打赏
  • 举报
回复
呃,你的m_ConnInfo结构里有CString类型的成员吧。
它可无法简单地用File.write写到文件里。
waitlife 2006-11-10
  • 打赏
  • 举报
回复
什么也没有改呀,只是多增加了一个文件头标志而巳,读的方法还是一样,另外,这种改了之后,偶尔还是会有问题,会提示刚才一样的错误!
taodm 2006-11-10
  • 打赏
  • 举报
回复
呃,你也注一下改了啥嘛。
waitlife 2006-11-10
  • 打赏
  • 举报
回复
程序执行到这里出错:
try
{
m_File.SeekToBegin();
m_File.Read(&m_ConnInfo, sizeof(ConnInfo));
}
就是Read语句,系统提示不能访问只读内存,另外,我刚刚改为下面的代码,则没有出错,不知是什么原因?
void CFileOperDlg::OnRead()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
BeginWaitCursor();
CFile m_File;
CString m_FilePath = _T("EnterMIS.cfg");
if(!m_File.Open(m_FilePath,CFile::modeRead|CFile::typeBinary))
{
EndWaitCursor();
AfxMessageBox(_T("打开文件出错"));
return;
}
try
{
m_File.SeekToBegin();
m_File.Read(&m_SysInfo, sizeof(SysInfo));
}
catch(...)
{
m_File.Close();
EndWaitCursor();
AfxMessageBox(_T("读系统信息出错"));
return;
}
/*
if(memcmp(&m_SysInfo.strAppName, "EnterMIS", 8))
{
m_File.Close();
EndWaitCursor();
AfxMessageBox(_T("系统信息内容非法"));
return;
}
*/
try
{
m_File.Seek(SYSINFOLEN,CFile::begin);
m_File.Read(&m_ConnInfo,sizeof(m_ConnInfo));
}
catch(...)
{
m_File.Close();
EndWaitCursor();
AfxMessageBox(_T("读连接信息出错"));
return;
}

m_UserR = m_ConnInfo.strUser;
m_PasswordR = m_ConnInfo.strPassword;
m_DataBaseR = m_ConnInfo.strDataBase;
m_ServerR = m_ConnInfo.strServer;
try
{
m_File.Close();
}
catch(...)
{
AfxMessageBox(_T("关闭文件出错"));
return;
}

EndWaitCursor();
UpdateData(FALSE);

}

void CFileOperDlg::OnWrite()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
BeginWaitCursor();
if(m_User.IsEmpty() || m_Password.IsEmpty() || m_Server.IsEmpty() || m_DataBase.IsEmpty())
{
EndWaitCursor();
AfxMessageBox(_T("对不起,信息不完整!"));
}

m_SysInfo.strAppName = "EnterMIS";
m_SysInfo.strVersion = _T("3.0");
m_SysInfo.strCredit = _T("XiaoQing");

m_ConnInfo.strUser = m_User;
m_ConnInfo.strPassword = m_Password;
m_ConnInfo.strDataBase = m_DataBase;
m_ConnInfo.strServer = m_Server;

CFile m_File;
CString m_FilePath = _T("EnterMIS.cfg");
if(!m_File.Open(m_FilePath,CFile::modeCreate|CFile::modeReadWrite|CFile::typeBinary))
{
EndWaitCursor();
AfxMessageBox(_T("打开文件出错"));
return;
}
try
{
m_File.SeekToBegin();
m_File.Write(&m_SysInfo,sizeof(m_SysInfo));
}
catch(...)
{
m_File.Close();
EndWaitCursor();
AfxMessageBox(_T("写系统信息出错"));
return;
}
try
{
m_File.Seek(SYSINFOLEN,CFile::begin);
m_File.Write(&m_ConnInfo,sizeof(ConnInfo));
}
catch(...)
{
m_File.Close();
EndWaitCursor();
AfxMessageBox(_T("写连接信息出错"));
return;
}
try
{
m_File.Close();
}
catch(...)
{
AfxMessageBox(_T("关闭文件出错"));
return;
}
EndWaitCursor();
}
taodm 2006-11-10
  • 打赏
  • 举报
回复
先说说你是哪一行发生的无效地址访问吧。
waitlife 2006-11-10
  • 打赏
  • 举报
回复
请教怎么分配内存?
memset?
taodm 2006-11-10
  • 打赏
  • 举报
回复
(&m_ConnInfo,....
m_ConnInfo还没有分配内存吧。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧