用CFileDialog获得一个文件的路径后需要关闭这个文件么?

asdfasfewrwer 2013-07-31 12:54:52
请教各位一个问题:
问题描述:
我新建了两个对话框1和2(通过1上的一个按钮触发),然后在2上通过一个按钮新建一个模态对话框CFileDialog用以获得一个文件的文件路径,然后点击2上的ok按钮退出。

问题:
请问这个对话框关闭后需要关闭刚刚选择的那个文件么?
点击2上的ok按钮后就会出现错误,错误地方指引到fclose(fclose.c文件)
if (stream->_flag & _IOSTRG)
stream->_flag = 0; /* IS THIS REALLY NEEDED ??? */

其中模态对话框的建立:
	CString pathName;

CString strFilter = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");

CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT, strFilter, this);
dlg.m_ofn.lpstrTitle = _T("Choose file");

if(dlg.DoModal() == IDOK)
{
pathName = dlg.GetPathName();
}


请问各位问题到底出在哪??
先谢谢各位了!
...全文
167 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
asdfasfewrwer 2013-07-31
  • 打赏
  • 举报
回复
问题终于找出来了,谢谢大家的回答,真的太谢谢大家了。 问题出在我用:((CEdit*)GetDlgItem(IDC_EDIT)->SetWindowText(tmp);传递变量的值到控件显示时,则当退出对话框执行OnOk后就会出错,而直接用UpdateData(FALSE)则不会出错。 这是什么原因,大家出现过这种情况么?
oyljerry 2013-07-31
  • 打赏
  • 举报
回复
引用 3 楼 qwe70007 的回复:
哦,我是先disable那个获取模态对话框的按钮,然后再enable获取文件名,最终点击ok(有updatedata)退出时就会出错。 不知道到底是获取文件名未关闭引起错误,还是因为disable然后enable最后在updatedata这个步骤有错。
应该是你UI操作引起的问题
daiweiru 2013-07-31
  • 打赏
  • 举报
回复
引用 4 楼 qwe70007 的回复:
只要退出对话框时有updatedata就会报错,如果没有则不会。
看你这样说,我在想你是updatedata(FALSE)了吗?想要将获取到的路径显示到什么地方吗?还是TRUE想要得到?很有可能是你更新的那个变量属于的那个窗口关闭了,或者不是当前窗口造成的,你调试一下试试看
向立天 2013-07-31
  • 打赏
  • 举报
回复
CFileDialog和打开文件没关系 报错的时候你看看调用堆栈 定位到自己的代码 你应该还是有些文件操作没有处理好 不过应该和CFileDialog无关
yaozhiyong110 2013-07-31
  • 打赏
  • 举报
回复
你获取文件路径那里都没open当然不需要close啊 不知道你报错的那个fclose是哪里调到的 CString pathName; CString strFilter = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"); CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, strFilter, this); dlg.m_ofn.lpstrTitle = _T("Choose file"); if(dlg.DoModal() == IDOK) { pathName = dlg.GetPathName(); } 这段代码是没问题的
u010588063 2013-07-31
  • 打赏
  • 举报
回复
不需要关闭的。你调试看看是否你其他地方代码出错。
asdfasfewrwer 2013-07-31
  • 打赏
  • 举报
回复
只要退出对话框时有updatedata就会报错,如果没有则不会。
asdfasfewrwer 2013-07-31
  • 打赏
  • 举报
回复
哦,我是先disable那个获取模态对话框的按钮,然后再enable获取文件名,最终点击ok(有updatedata)退出时就会出错。 不知道到底是获取文件名未关闭引起错误,还是因为disable然后enable最后在updatedata这个步骤有错。
asdfasfewrwer 2013-07-31
  • 打赏
  • 举报
回复
引用 1 楼 hdg3707 的回复:
1。 不需要关闭文件,因为只是获取路径,并没有打开文件 2。 你打开文件了吗,stream这个变量是否打开过文件,如果没有打开文件,肯定会不行的。另外,OK是关闭对话框,你在这里打开文件,接着关闭对话框了,这相当于没有打开文件
首先谢谢你的回答。 我没有打开文件,只是想获取文件的名字。“如果没有打开文件,肯定会不行的。”请问下这句话是什么意思? 谢谢。
hdg3707 2013-07-31
  • 打赏
  • 举报
回复
1。 不需要关闭文件,因为只是获取路径,并没有打开文件 2。 你打开文件了吗,stream这个变量是否打开过文件,如果没有打开文件,肯定会不行的。另外,OK是关闭对话框,你在这里打开文件,接着关闭对话框了,这相当于没有打开文件
昨夜无风 2013-07-31
  • 打赏
  • 举报
回复
引用 10 楼 qwe70007 的回复:
问题终于找出来了,谢谢大家的回答,真的太谢谢大家了。 问题出在我用:((CEdit*)GetDlgItem(IDC_EDIT)->SetWindowText(tmp);传递变量的值到控件显示时,则当退出对话框执行OnOk后就会出错,而直接用UpdateData(FALSE)则不会出错。 这是什么原因,大家出现过这种情况么?
窗口都销毁了,你再操作和句柄相关的变量就会出错!
daiweiru 2013-07-31
  • 打赏
  • 举报
回复
引用 10 楼 qwe70007 的回复:
问题终于找出来了,谢谢大家的回答,真的太谢谢大家了。 问题出在我用:((CEdit*)GetDlgItem(IDC_EDIT)->SetWindowText(tmp);传递变量的值到控件显示时,则当退出对话框执行OnOk后就会出错,而直接用UpdateData(FALSE)则不会出错。 这是什么原因,大家出现过这种情况么?
大概就是我说的那种情况,找不到控件所在的那个窗口了,还往哪儿update啊,你的IDC_EDIT这个控件是在关闭掉的那个窗口上,还是关闭以后显示的那个窗口上,如果在关闭掉的那个窗口上,你都关闭了,还update,他找不到目的地了,所以会报错,如果是关闭以后显示的窗口,你就不能用update了,可以用中间变量传递

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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