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)不是很懂,希望哪位能帮我看一下,谢谢
先把它的指向类型变为char型,在作为函数的参数
char是8位,short是16位吧,所以转换后的sdata指针指向的数组长度以char类型算的话就应该是m_Length*2不好意思,我好像表述的不太清楚
我用FileStream去读,然后用BinaryReader和StreamReader分别去读,得到的都是乱码
你可以先把数据弄到一个byte数组中,再用Encoding的GetString函数就可以得到字符串了
当然,你可能要设定好字符编码
byte[] array = new byte[1024];
fs.Read(array, 0, 1024);
string s = Encoding.BigEndianUnicode.GetString(array);你的意思是这样?得不到正确的数据。
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[]的内容。