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 调用,估计应该没问题。但有没有更简单的法子你?

解决方案 »

  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.   

    char m_fileName[256];我以前转成宽字节处理:MultiByteToWideChar看了6楼的那代码又受教育了.
      

  10.   

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