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 在打开时候,默认的目录,能指定吗? 展开
if(fd.DoModal()==IDOK)
{
hFile=fopen(fd.GetPathName(), "rb");
编译会提示:error C2664: 'fopen' : cannot convert parameter 1 from 'CString' to 'const char *'
应该怎么转换类型? 强制貌似不行。。。
第二个问题是,CFileDialog 在打开时候,默认的目录,能指定吗? 展开
5个回答
展开全部
你这个是因为你的程序选择了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"。
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"。
展开全部
第一个问题,一般都是将文件名再输出到一个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)
第二个问题参见下面的代码,比如设置为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)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
默认目录可以指定。
CFileDialog fd(true,NULL,"C:\\windows\\*.*")
关于类型转换的问题,可以用LPCTSTR。
hFile=fopen((LPCTSTR)(fd.GetPathName()), "rb");
正常情况下,这个转换时可以自动进行的。
CFileDialog fd(true,NULL,"C:\\windows\\*.*")
关于类型转换的问题,可以用LPCTSTR。
hFile=fopen((LPCTSTR)(fd.GetPathName()), "rb");
正常情况下,这个转换时可以自动进行的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
为什么不用fd.GetPathName().GetBuffer();
CString 和char*确实是无法强制转化的,因为他们的存储结构不匹配。
CString 类型在内存中存放的前几个字节是int型(这个记不得清楚了,也可能是short,long)的字符串长度。即使能够强制转化通过,转化出来的也是错的,所以编译器报错倒是件好事。
你做个程序,对CString类型测试一下吧。
CString 和char*确实是无法强制转化的,因为他们的存储结构不匹配。
CString 类型在内存中存放的前几个字节是int型(这个记不得清楚了,也可能是short,long)的字符串长度。即使能够强制转化通过,转化出来的也是错的,所以编译器报错倒是件好事。
你做个程序,对CString类型测试一下吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上的基本上说的很清楚了,续貂一下:LPCTSTR是CString类提供的重载操作符,所以可以直接利用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询