vs2010 unicode字符集下,如何使用CFile打开任意一个文件

时间:2023-02-04 20:20:10
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字串中“\”永远具有“转意”性质,与字符集编码无关

#2


我的意思是:在多字节字符集下,下面这段代码 
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]

#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);

#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楼的那代码又受教育了.

#12


char m_fileName[256]改为TCHAR m_fileName[256]
或者转换成CString strFileName(m_fileName);

#1


本来就应该写成 ("e: \\动态切分.bmp"), 
在c字串中“\”永远具有“转意”性质,与字符集编码无关

#2


我的意思是:在多字节字符集下,下面这段代码 
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]

#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);

#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楼的那代码又受教育了.

#12


char m_fileName[256]改为TCHAR m_fileName[256]
或者转换成CString strFileName(m_fileName);