Unicode文件的读写

由于之前没有对Unicode文件的读写写过代码,对其了解甚少,今天搞了一天Unicode文件的读写,现在终于明白了好多问题,跟大家分享一下吧。

          至于Unicode编码的定义我就不说了,自己查资料去吧。

          以Unicode编码的文件开头的两个字节(即第一个字符)是硬性规定的,即0xfeff(还有一种Unicode编码文件的是0xfffe,这里先不介绍),故大家在读文件头的时候可以据此判断该文件是不是Unicode编码的文件.

          当我把文件的内容读到一个WCHAR变量数组的里时,第一个元素就是0xfeff,该文件的实际内容是从第二个元素开始的,这个我开始不知道,弄得我头疼了半天,后来通过调试并监视数据终于知道了。下面给一个我写的有关读取Unicode和ansi编码文件的小程序代码:

void CUnicode文件读写Dlg::OnBnClickedOk()
{
 // 读Unicode编码的文件
 WCHAR FileName[128];
 wcscpy_s(FileName,_countof(FileName),_T(""));
 GetCurrentDirectory(128,FileName);
 wcscat_s(FileName,_countof(FileName),_T("//Data//Unicode.txt")); // 该文件的内容为"Hello 中国,中华人民共和国    Good"

 CFile file(FileName,CFile::modeCreate |
 CFile::modeNoTruncate | CFile::typeBinary |
 CFile::modeReadWrite  | CFile::shareDenyNone);

 WCHAR FileContent[10];
 wcscpy_s(FileContent,_countof(FileContent),_T(""));

 file.Seek(0,CFile::begin);   // 如果只需要文件中的实际内容,可以从第三个字节开始读取,即"file.Seek(2,CFile::begin);",不能为"file.Seek(1,CFile::begin);",否则会出现乱码
 file.Read(FileContent,18);   // 第二个参数为读取18字节(即9个字符,包括了第一个字符0xfeff,实际有用的为后8个字符)

 FileContent[9]='/0';    // 如果文件后方还有其他字符,需要添加结束字符'/0'

 int size=wcslen(FileContent);  // 得到的长度为9个字符,但实际上你能看见的只有8个字符,这里让我郁闷了半天,这里明白了后面就很容易理解了

 WCHAR ch[50];      // 每一个元素为两个字节,即该数组占用了100个字节
 wcscpy_s(ch,_countof(ch),_T("Hello 中国,中华人民共和国"));

 int chLen=wcslen(ch);    // 该值等于16
 int readLen=wcslen(FileContent); // 该值为9

 int ret = wcsncmp(&FileContent[1],ch,readLen-1); // 对前8个字符进行比较,这里需要从第二个元素开始比较

 long asc=(long)FileContent[0];      // 取第一个元素,验证是否为0xfeff,即Unicode编码文件的标志

 if(asc==0xfeff)
 {
  // Do something
  MessageBox(_T("OK!"));       // 程序将出现OK对话框
 }
 else
 {
  // Do something
  MessageBox(_T("No!"));
 }
}

void CUnicode文件读写Dlg::OnBnClickedButton1()
{
 // 读取ANSI编码的文件
 WCHAR FileName[128];
 wcscpy_s(FileName,_countof(FileName),_T(""));
 GetCurrentDirectory(128,FileName);
 wcscat_s(FileName,_countof(FileName),_T("//Data//Ansi.txt"));  // 该文件内容为“Hello 中国,中华人民共和国”

 char FileContent[50]="";

 CFile file(FileName,CFile::modeCreate |
 CFile::modeNoTruncate | CFile::typeBinary |
 CFile::modeReadWrite  | CFile::shareDenyNone);

 file.Seek(0,CFile::begin);
 file.Read(FileContent,16);

 int size=strlen(FileContent);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值