大家快帮忙看看我的程序,迷茫中....

lianxiangke   2007-9-4 13:07 楼主
是个读一个.txt文件内容的问题,其中strtxt是文件名字(***.txt)的变量。
代码如下:
void ReadTxt::OnOK()
{
        // TODO: Add extra validation here
        //---------------createfile打开,然后用readfile读取数据----------------//
        HANDLE hFile;
        DWORD dwBytesRead;
        char buff[4096];
        hFile = CreateFile(strtxt,GENERIC_READ,0,NULL,OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,NULL);
        if(hFile == INVALID_HANDLE_VALUE)
        {
                AfxMessageBox(L"Cound not open the file");
                return;
        }

        if(ReadFile(hFile,buff,4096,&dwBytesRead,NULL))
        {
                CEdit* p = NULL;
                p = (CEdit*)GetDlgItem(IDC_EDIT1);
                GetDlgItem(IDC_EDIT1)->SetWindowText((const unsigned short *)buff);
                GotoDlgCtrl(p);
                free(p);
        }
}
这个,在evc的编辑框控件IDC_EDIT1中就是显示乱码,本来是sdhfos12456这样的一个字符串就显示着方块或不知道什么符号的乱码,很郁闷。
下面是我写的程序的另一个版本,但只能显示txt文件里字符串的第一位。这样的:
void ReadTxt::OnOK()
{
        // TODO: Add extra validation here
        //---------------createfile打开,然后用readfile读取数据----------------//
        HANDLE hFile;
        DWORD dwBytesRead;
        CString str;
        hFile = CreateFile(strtxt,GENERIC_READ,0,NULL,OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,NULL);
        if(hFile == INVALID_HANDLE_VALUE)
        {
                AfxMessageBox(L"Cound not open the file");
                return;
        }

        if(ReadFile(hFile,  (LPSTR)(LPCTSTR)str, 1, &dwBytesRead, NULL))
        {
                CEdit* p = NULL;
                p = (CEdit*)GetDlgItem(IDC_EDIT1);
                GetDlgItem(IDC_EDIT1)->SetWindowText(str);
                GotoDlgCtrl(p);
                free(p);
        }
}这个就能显示asdfhso13546的第一位的a,而把ReadFile的第三个参数改成100等数字却变成了如第一个写法中一样的一行乱码。实在找不到办法全正确显示出来啊
大家帮帮忙,困扰我整整一天了。谢谢大家!!!!

回复评论 (5)

从文件里读出来是ASCII码,WinCE下要正确显示,必须转换成UNICODE。
点赞  2007-9-4 13:42
超级谢谢!   我试试去!
点赞  2007-9-4 14:47
从文件里读出来是ASCII码,WinCE下要正确显示,必须转换成UNICODE。
若还不可以,在试试别的编码.
点赞  2007-9-4 14:57
在网上查ASC2码转UNICODE用mbstowcs,但具体怎用不了解喔,能否给代码,谢谢+谢谢
点赞  2007-9-4 15:03
首先定义中文数组应该用双字节指针wchar_t,而拷贝函数也不能用strcpy,而应该用:       wchar_t * wcscpy(wchar_t * wDest,wchar_t * wSource);函数,操作如下:
       wchar_t s[20];
       CString str=“你好”;
       wcscpy(s,(LPCTSTR)str); //前面没有转成UNICODE编码,所以这里需要强制转换

  多字节和宽字符之间转换的函数:mbstowcs, mbtowc, wcstombs, wctomb.
  mbstowcs---Convert a multi-byte(ANSI) string to wide character stirng(Unicode).
  wcstombs---Convert a wide character string to multi-byte string.
  WCHAR szwcBuffer[100];
  char szBuffer[100];
  char* lpszConvert = "ANSI String to convert";
  WCHAR* lpszwcConvert = _T("Unicode string to convert");
  int nChars;
  nChars = mbstowcs(szwcBuffer, lpszConvert, 100);
  nChars = wcstombs(szBuffer, lpszwcConvert, 100);
点赞  2007-9-4 15:21
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复