char m_fileName[256];
CFile dibFile;
//dibFile.Open(_T("e:\\动态切分.bmp"), CFile::modeRead);
dibFile.Open(m_fileName, CFile::modeRead);
在多字节字符集下
dibFile.Open(m_fileName, CFile::modeRead);没问题,可直接转换。但若是unicode字符集,就不能直接转换。使用
dibFile.Open((LPCTSTR)m_fileName, CFile::modeRead);,编译可通过,但运行的时候,文件路径不对,相当于
dibFile.Open(_T("e:\动态切分.bmp"), CFile::modeRead);少了 一个“\ ”,导致不行。若写一个方法,读到m_fileName的内容,在逐渐加一个“\”,再供dibFile.Open 调用,估计应该没问题。但有没有更简单的法子你?
12 个解决方案
#1
本来就应该写成 ("e:
\\动态切分.bmp"),
在c字串中“\”永远具有“转意”性质,与字符集编码无关
在c字串中“\”永远具有“转意”性质,与字符集编码无关
#2
我的意思是:在多字节字符集下,下面这段代码
可以很好的运行。但是在unicode字符集下,编译不能通过,因为dibFile.Open()的第一个参数是LPCTSTR,无法完成从char * 到LPCTSTR 的自动转换( 注意在多字节字符集下同一个函数一点问题都没有!)。因此,问题就来了,使用强制转换
有没有好的法子,在unicode字符集下,也能使用
附:获取文件名代码片段:
char m_fileName[256];
CFile dibFile;
dibFile.Open(m_fileName, CFile::modeRead);
可以很好的运行。但是在unicode字符集下,编译不能通过,因为dibFile.Open()的第一个参数是LPCTSTR,无法完成从char * 到LPCTSTR 的自动转换( 注意在多字节字符集下同一个函数一点问题都没有!)。因此,问题就来了,使用强制转换
dibFile.Open((LPCTSTR)m_fileName, CFile::modeRead);,编译可通过,但运行出错。原因是:比如
m_fileName ="e:\动态切分.bmp"; // 这个路径是从对话框传进去的,dibFile.Open()调用的时候,仍使用"e:\动态切分.bmp",导致出错。
有没有好的法子,在unicode字符集下,也能使用
dibFile.Open(m_fileName, CFile::modeRead);
附:获取文件名代码片段:
CString filename;
CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle = _T("打开图片对话框");
fileDlg.m_ofn.lpstrFilter = _T("BMP File(*.bmp)\0*.bmp\0\0");
if (IDOK == fileDlg.DoModal())
{
//filename.Format("%s",fileDlg.GetPathName());
filename = fileDlg.GetPathName();
}
#3
不要光说文件是unicode的,也要说具体的文件编码格式,比如UTF-8,也是一种Unicode编码,不同的文件编码,开头bom格式不一样的。另外Unicode工程,我全部只用
TCHAR,而不用char m_fileName[256]
TCHAR,而不用char m_fileName[256]
#4
http://topic.csdn.net/u/20091224/05/4d9d652f-7d74-4d42-af5b-d7ad193e077d.html
#5
char m_fileName[256];改为TCHAR m_fileName[256];
#6
dibFile.Open((LPCTSTR)m_fileName, CFile::modeRead);
-->
dibFile.Open(CString(m_fileName), CFile::modeRead);
-->
dibFile.Open(CString(m_fileName), CFile::modeRead);
#7
标准作法:
int nChars;
CFile fRead;
m_strContent=_T("");
if (!fRead.Open(m_strFilePath,CFile::modeRead))
{
MessageBox(_T("文件打开出错!"),_T("警告"),MB_ICONERROR);
return;
}
DWORD dwLength = (DWORD)fRead.GetLength();
char *buf=new char[dwLength+1];//注意这里要加1
fRead.Read(buf,dwLength);
buf[dwLength]=0;//这是文件结尾符!必需要有
nChars=MultiByteToWideChar(CP_ACP,0,buf,-1,NULL,0); //获取宽字节所需的缓冲区长度。
TCHAR *wbuff=new TCHAR [nChars];
MultiByteToWideChar(CP_ACP,0,buf,-1,wbuff,nChars);
m_strContent = wbuff;
if (NULL != buf)
{
delete buf;
}
if (NULL != wbuff)
{
delete wbuff;
}
fRead.Close();
//防止数据太长,只显示部分数据
m_RichEditCtrl.SetSel(0,-1);
m_RichEditCtrl.Clear();
m_RichEditCtrl.ReplaceSel(m_strContent.Left(1000));
#8
没看清问题,CString就是LPCTSTR,为啥还要char m_fileName[256];,unicode下也不应该用char应该直接TCHAR
#9
unicode怎么处理呢?
#10
unicode怎么处理呢?
#11
char m_fileName[256];我以前转成宽字节处理:MultiByteToWideChar
看了6楼的那代码又受教育了.
看了6楼的那代码又受教育了.
#12
char m_fileName[256]改为TCHAR m_fileName[256]
或者转换成CString strFileName(m_fileName);
或者转换成CString strFileName(m_fileName);
#1
本来就应该写成 ("e:
\\动态切分.bmp"),
在c字串中“\”永远具有“转意”性质,与字符集编码无关
在c字串中“\”永远具有“转意”性质,与字符集编码无关
#2
我的意思是:在多字节字符集下,下面这段代码
可以很好的运行。但是在unicode字符集下,编译不能通过,因为dibFile.Open()的第一个参数是LPCTSTR,无法完成从char * 到LPCTSTR 的自动转换( 注意在多字节字符集下同一个函数一点问题都没有!)。因此,问题就来了,使用强制转换
有没有好的法子,在unicode字符集下,也能使用
附:获取文件名代码片段:
char m_fileName[256];
CFile dibFile;
dibFile.Open(m_fileName, CFile::modeRead);
可以很好的运行。但是在unicode字符集下,编译不能通过,因为dibFile.Open()的第一个参数是LPCTSTR,无法完成从char * 到LPCTSTR 的自动转换( 注意在多字节字符集下同一个函数一点问题都没有!)。因此,问题就来了,使用强制转换
dibFile.Open((LPCTSTR)m_fileName, CFile::modeRead);,编译可通过,但运行出错。原因是:比如
m_fileName ="e:\动态切分.bmp"; // 这个路径是从对话框传进去的,dibFile.Open()调用的时候,仍使用"e:\动态切分.bmp",导致出错。
有没有好的法子,在unicode字符集下,也能使用
dibFile.Open(m_fileName, CFile::modeRead);
附:获取文件名代码片段:
CString filename;
CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle = _T("打开图片对话框");
fileDlg.m_ofn.lpstrFilter = _T("BMP File(*.bmp)\0*.bmp\0\0");
if (IDOK == fileDlg.DoModal())
{
//filename.Format("%s",fileDlg.GetPathName());
filename = fileDlg.GetPathName();
}
#3
不要光说文件是unicode的,也要说具体的文件编码格式,比如UTF-8,也是一种Unicode编码,不同的文件编码,开头bom格式不一样的。另外Unicode工程,我全部只用
TCHAR,而不用char m_fileName[256]
TCHAR,而不用char m_fileName[256]
#4
http://topic.csdn.net/u/20091224/05/4d9d652f-7d74-4d42-af5b-d7ad193e077d.html
#5
char m_fileName[256];改为TCHAR m_fileName[256];
#6
dibFile.Open((LPCTSTR)m_fileName, CFile::modeRead);
-->
dibFile.Open(CString(m_fileName), CFile::modeRead);
-->
dibFile.Open(CString(m_fileName), CFile::modeRead);
#7
标准作法:
int nChars;
CFile fRead;
m_strContent=_T("");
if (!fRead.Open(m_strFilePath,CFile::modeRead))
{
MessageBox(_T("文件打开出错!"),_T("警告"),MB_ICONERROR);
return;
}
DWORD dwLength = (DWORD)fRead.GetLength();
char *buf=new char[dwLength+1];//注意这里要加1
fRead.Read(buf,dwLength);
buf[dwLength]=0;//这是文件结尾符!必需要有
nChars=MultiByteToWideChar(CP_ACP,0,buf,-1,NULL,0); //获取宽字节所需的缓冲区长度。
TCHAR *wbuff=new TCHAR [nChars];
MultiByteToWideChar(CP_ACP,0,buf,-1,wbuff,nChars);
m_strContent = wbuff;
if (NULL != buf)
{
delete buf;
}
if (NULL != wbuff)
{
delete wbuff;
}
fRead.Close();
//防止数据太长,只显示部分数据
m_RichEditCtrl.SetSel(0,-1);
m_RichEditCtrl.Clear();
m_RichEditCtrl.ReplaceSel(m_strContent.Left(1000));
#8
没看清问题,CString就是LPCTSTR,为啥还要char m_fileName[256];,unicode下也不应该用char应该直接TCHAR
#9
unicode怎么处理呢?
#10
unicode怎么处理呢?
#11
char m_fileName[256];我以前转成宽字节处理:MultiByteToWideChar
看了6楼的那代码又受教育了.
看了6楼的那代码又受教育了.
#12
char m_fileName[256]改为TCHAR m_fileName[256]
或者转换成CString strFileName(m_fileName);
或者转换成CString strFileName(m_fileName);