解决方案 »

  1.   

    楼主该好好复习以下指针的知识你这几行代码就好几个错误pbuf是个wchar_t指针
     pbuf = new wchar_t[3];   // 分配长度为3的wchar_t数组,将pbuf指向这个数组
    pbuf=L"你好";                  // 字符串复制应使用wcscpy, 这时指针不再指向原来的数组,而是指向L“你好”的常量字符串
    pbuf[2] = 0x0000;            // 因为指向L“你好“的常量字符串,这时你对常量进行修改,内存访问非法了你的这段代码应该这样修改
    pbuf = new wchar_t[3];
    wcscpy(pbuf, L"你好");  // 字符串复制需要wcscpy,最好用wcscpy_s
      

  2.   

    谢谢大神,我用下面的代码读取以unicode代码保存的txt,里面一共就存了几个汉字,用messagebox显示的时候汉字后边多了一个?号,这是怎么回事啊,我用editplus看了下?的十六进制代码,确实是 0000  ,难道是最后一个字符 ?
              wchar_t *pbuf;
    DWORD fileLen;
    fileLen=file.GetLength()/2;//返回文件长度,字节为单位
    pbuf = new wchar_t[fileLen+1];
    pbuf[fileLen] = 0x0000;
    file.Seek(2,CFile::begin);
    file.Read(pbuf,fileLen*2);
    file.Close();
    CString result(pbuf);
    MessageBox(result);
      

  3.   

    用 memset(pbuf,0,fileLen*sizeof(DWORD)); 初始化一下缓冲区再写试试。
      

  4.   

    谢谢大神,我用下面的代码读取以unicode代码保存的txt,里面一共就存了几个汉字,用messagebox显示的时候汉字后边多了一个?号,这是怎么回事啊,我用editplus看了下?的十六进制代码,确实是 0000  ,难道是最后一个字符 ?
              wchar_t *pbuf;
    DWORD fileLen;
    fileLen=file.GetLength()/2;//返回文件长度,字节为单位
    pbuf = new wchar_t[fileLen+1];
    pbuf[fileLen] = 0x0000;
    file.Seek(2,CFile::begin);
    file.Read(pbuf,fileLen*2);
    file.Close();
    CString result(pbuf);
    MessageBox(result);fileLen获取的是整个文件的长度,但是UNICODE头上还有BOM头,实际字符串长度是fileLen - 1
    你分配的数组多了一个字符,这个字符应该是随机数据,你看到是?是很正常的。所以代码应该改为fileLen=(file.GetLength() - 2) / 2;就对了
    另外你的pbuf[fileLen]= '\0';最好放在Read操作的后边,这样可避免由于Read操作错误覆盖了你先赋值的结束符'\0';
      

  5.   

    pbuf = new wchar_t[fileLen+1];
    pbuf[fileLen] = 0x0000;
    ---------------------------------------------------->
    pbuf = new wchar_t[fileLen+1];
    memset(pbuf,0,sizeof(wchar_t)*(fileLen+1)); 试试
      

  6.   

    谢谢大神,我用下面的代码读取以unicode代码保存的txt,里面一共就存了几个汉字,用messagebox显示的时候汉字后边多了一个?号,这是怎么回事啊,我用editplus看了下?的十六进制代码,确实是 0000  ,难道是最后一个字符 ?
              wchar_t *pbuf;
    DWORD fileLen;
    fileLen=file.GetLength()/2;//返回文件长度,字节为单位
    pbuf = new wchar_t[fileLen+1];
    pbuf[fileLen] = 0x0000;
    file.Seek(2,CFile::begin);
    file.Read(pbuf,fileLen*2);
    file.Close();
    CString result(pbuf);
    MessageBox(result);fileLen获取的是整个文件的长度,但是UNICODE头上还有BOM头,实际字符串长度是fileLen - 1
    你分配的数组多了一个字符,这个字符应该是随机数据,你看到是?是很正常的。所以代码应该改为fileLen=(file.GetLength() - 2) / 2;就对了
    另外你的pbuf[fileLen]= '\0';最好放在Read操作的后边,这样可避免由于Read操作错误覆盖了你先赋值的结束符'\0';
    多谢指点,感激不尽
      

  7.   

    因为wchar_t是两个字节,因为字符串双引号前面加L就表示字符串中的字符按UTF16编码,这样=两面就兼容了