void CReadItDlg::OnRead() 
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
CStdioFile pfile;
CString timfile=m_File;
pfile.Open(timfile, CFile::modeRead|CFile::shareDenyNone|CFile::typeBinary);
short *sdata=new short[m_Length]; //最长32k个数
pfile.Read((char *)sdata, m_Length*2); 
pfile.Close(); CString str;
for(int i=0;i<m_Length;i++)
{
str.Format("%d",sdata[i]); 
m_List.AddString(str); 
}}这是一段C++的代码,本人是用C#的,对这段代码pfile.Read((char *)sdata, m_Length*2)不是很懂,希望哪位能帮我看一下,谢谢

解决方案 »

  1.   

    一个指向short类型数组的指针sdata,应该是个缓冲区吧,以short类型算长度为m_Length
    先把它的指向类型变为char型,在作为函数的参数
    char是8位,short是16位吧,所以转换后的sdata指针指向的数组长度以char类型算的话就应该是m_Length*2不好意思,我好像表述的不太清楚
      

  2.   

    如果要用C#的话,这里最长只有32k,我一般用stackalloc开辟缓冲区,这样就可以不用fixed,同样可以使用指针(要unsafe代码),当然,函数结束前你要把缓冲区的数据弄走
      

  3.   

    那么用C#怎么实现这段代码?
    我用FileStream去读,然后用BinaryReader和StreamReader分别去读,得到的都是乱码
      

  4.   

    缓冲区里是什么?字符嘛
    你可以先把数据弄到一个byte数组中,再用Encoding的GetString函数就可以得到字符串了
    当然,你可能要设定好字符编码
      

  5.   

                         FileStream fs = new FileStream(path, FileMode.Open);
                    byte[] array = new byte[1024];
                    fs.Read(array, 0, 1024);
                    string s = Encoding.BigEndianUnicode.GetString(array);你的意思是这样?得不到正确的数据。
      

  6.   

    OK,那给你翻译下,但绝对不是7楼的写法,只要用到Encoding类的,绝对是错误的。
      

  7.   


                int m_Length = 32 * 1024;//最长32k个数
                string timfile = "C:\\1.dat";//文件名,自己定义
                List<string> m_List = new List<string>();//存放结果
                FileStream fs = File.Open(timfile, FileMode.Open);
                byte[] bytes = new byte[m_Length * 2];
                int count = fs.Read(bytes, 0, m_Length * 2);
                //如果读取的长度非偶数,加1凑偶
                if (count % 2 == 1)
                    count++;
                for (int i = 0; i < count; i += 2)
                {
                    m_List.Add(BitConverter.ToInt16(bytes, i).ToString());
                }简单说明下:
    原代码short *sdata=new short[m_Length];我直接用2倍长度的byte[]代替。
    由于C++的char的长度和byte相等,因此对于sdata按照char访问,就是m_Length*2的长度,说白了就是按字节读取。
    最后因为用的是sdata[i]访问,说明是按照short来存储,因此我用BitConverter.ToInt16转换byte[]的内容。