MFC CFileDialog的问题...

CFileDialogfd(true);if(fd.DoModal()==IDOK){hFile=fopen(fd.GetPathName(),"rb");编译会提示:e... CFileDialog fd(true);
if(fd.DoModal()==IDOK)
{
hFile=fopen(fd.GetPathName(), "rb");

编译会提示:error C2664: 'fopen' : cannot convert parameter 1 from 'CString' to 'const char *'

应该怎么转换类型? 强制貌似不行。。。

第二个问题是,CFileDialog 在打开时候,默认的目录,能指定吗?
展开
 我来答
Frank7258
2011-01-04 · TA获得超过1503个赞
知道小有建树答主
回答量:381
采纳率:0%
帮助的人:552万
展开全部
你这个是因为你的程序选择了Unicode编码,在Unicode编码下,系统默认的字符为wchar_t,一个字符两字节,这时候CString也默认转换成一个字符两字节的wchar_t。而fopen是个ANSI字符的函数,不能接受宽字符(wchar_t)所以编译器就报错了。解决方法有两个

1. 使用Unicode函数,基本所有的ANSI函数都带有一个Unicode版本的,fopen则为_wfopen

2. 使用USES_CONVERSION类型转换
A2T可以把ANSI编码转换成Unicode编码,T2A则相反。使用前先要定义USES_CONVERSION


USES_CONVERSION;
fopen(T2A(fd.GetPathName()), "rb")...
即可。

不过强烈推荐全部使用Unicode编码的函数,适合多语言和国际化的需要。

另外,微软增加了一种TCHAR的变量类型,其中T就是指的是当编译器设置了Unicode,那么全部按照wchar来处理,如果编译器设定了ANSI字符,则全部按照char处理。

也就是相当于(事实上要更复杂一些)
#ifdef _UNICODE
#define TCHAR wchar_t
#else
#define TCHAR char
#endif

Windows定义的字符串指针类型
LPCTSTR
LPTSTR
这里面的T就是TCHAR的意思,令注,C是const的意思,LP是指针的意思,STR是字符

LPCTSTR被定义为 const TCHAR*,根据Unicode选项为const char*或者const wchar_t*
LPTSTR则为TCHAR*,根据Unicode选项为char*或者wchar_t*

所有的函数都带TCHAR版本,自动适应ANSI和Unicode设置的需要,
比如
_tprintf
_tscanf
_tfopen
等,这些函数都可以在msdn查到。

另外,Windows API以及MFC函数都是以TCHAR编写的。

在定义字符串常量的时候,一律要用宏_T()包括定义的字符串,比如
CString str = _T("test");
在Unicode激活的时候,变成L"test"的Unicode字符串,未激活Unicode则是普通的"test"。
郑启道
2011-01-03 · TA获得超过322个赞
知道小有建树答主
回答量:265
采纳率:0%
帮助的人:308万
展开全部
第一个问题,一般都是将文件名再输出到一个char变量数组的,我一直都是如此做的。
第二个问题参见下面的代码,比如设置为C根目录:
CFileDialog FileDlg(TRUE,"*.exe",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"Exe files(*.exe)|*.exe|All files (*.*)|*.*||");
FileDlg.m_ofn.lpstrInitialDir="C:\\";

if(FileDlg.DoModal()==IDOK)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
陈宗权8d804
2011-01-03 · TA获得超过3766个赞
知道小有建树答主
回答量:1159
采纳率:0%
帮助的人:961万
展开全部
默认目录可以指定。
CFileDialog fd(true,NULL,"C:\\windows\\*.*")

关于类型转换的问题,可以用LPCTSTR。
hFile=fopen((LPCTSTR)(fd.GetPathName()), "rb");
正常情况下,这个转换时可以自动进行的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wxmeng04
2011-01-04 · TA获得超过556个赞
知道小有建树答主
回答量:328
采纳率:0%
帮助的人:124万
展开全部
为什么不用fd.GetPathName().GetBuffer();
CString 和char*确实是无法强制转化的,因为他们的存储结构不匹配。
CString 类型在内存中存放的前几个字节是int型(这个记不得清楚了,也可能是short,long)的字符串长度。即使能够强制转化通过,转化出来的也是错的,所以编译器报错倒是件好事。
你做个程序,对CString类型测试一下吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
reallygone
2011-01-04 · 超过31用户采纳过TA的回答
知道答主
回答量:75
采纳率:0%
帮助的人:54.2万
展开全部
楼上的基本上说的很清楚了,续貂一下:LPCTSTR是CString类提供的重载操作符,所以可以直接利用。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式