迷你5207专属论坛

注册

 

发新话题 回复该主题

[魅族M8] 魅族M8SDK学习系列之保存为文本文件(unicode和ansi) [复制链接]

发表者
不怕大家笑话,为了解决读/写文本文件问题,我整整解决了一个月,当然只是在很少的一部分时间,毕竟还要工作。内心无比平静,因为其实没啥。呵呵。

上一篇中已经贴了解决读取Ansi和Unicode文本文件的方法,今天终于找到了一个可以简单写文本文件的方法。看样子我写程序没啥天赋,这么个简单问题都解决了这么久,找遍了google和baidu都找不到直接的方法来解决。但是,但是,还是解决了不容易呀。哈哈哈哈哈哈。

废话喷过后进入主题,考虑到目前使用UTF8的地方不多,主要是Ansi和unicode两种编码格式。所以从读开始就是围绕这两种格式展开的,写也一样只支持了Ansi和unicode。

我们知道这些编码最重要的区别就是BOM结构(BOM说明详见http://www.mini188.com/showtopic-971.aspx),在上一篇读取的文章就说到通过取两个字节进行判断就能知道是什么文本编码,写一样的道理,只要写入前BOM一同写入即可咯。根据这个思路就设计两个方法分别用于保存Ansi和unicode,如下:
  1. //保存Ansi文本
  2. void M8NoteFileReader::SaveFileByAnsi(TCHAR *context)
  3. {
  4.         ofstream outFile;
  5.         outFile.open(m_FileName.C_Str(), ios::out | ios::binary);
  6.         if (outFile.is_open())
  7.         {                
  8.                 char * ss = wch2chr(context);
  9.                 int nLen = strlen(ss);
  10.                 outFile.seekp(0, ios::beg);
  11.                 outFile.write(ss, nLen);
  12.         }
  13.         outFile.close();
  14. }
复制代码
在代码中可以看到SaveFileByAnsi(TCHAR *context)函数,函数名已经说明了意图就是保存使用Ansi格式保存文本文件。
在wince中默认的就是unicode,所以函数是宽字节字符串。对于ansi格式直接使用ofstream输出流进行写操作,在函数中有一句代码很重要:
char * ss = wch2chr(context);
这句代码实现了将宽字节字符串转换为单字节字符串的功能,这样就可能使用ofstream进行写操作了,否则是不行地。另外注意了写之前要使用seekp将流的指针移动到开始位置,这样写文件后就能整个的替换掉文本内容了。

当然最后要close()释放掉文件资源。
  1. //保存Unicode文本
  2. void M8NoteFileReader::SaveFileByUnicode(TCHAR *context)
  3. {
  4.         wofstream outFile;
  5.         outFile.open(m_FileName.C_Str(), ios::out | ios::binary);
  6.         if (outFile.is_open())
  7.         {
  8.                 outFile.seekp(0, ios::beg);
  9.                 //先写入bom结构
  10.                 TCHAR bom = 0xfeff;
  11.                 outFile.write(&bom, 1);
  12.                 //再写入文本内容
  13.                 int nLen = wcslen(context);
  14.                 outFile.write(context, nLen);
  15.         }
  16.         outFile.close();
  17. }
复制代码
保存Unicode文本方法有少许不同,主要是多了一个写Bom结构的步骤。
//先写入bom结构
TCHAR bom = 0xfeff;
outFile.write(&bom, 1);

因为unicode的BOM编码格式是0xfffe,所以只要写入一个字大小的字符就好啦注意这里是一个word大小哦。

写入bom结构后就可以写入正文咯,由于传入的内容就是宽字符的所以不用做转换直接写入就好,哦,这里要注意写unicode的类是wofstream

就这么简单两个方法搞定。




作者:5207
出处:http://www.mini188.com
本文版权归作者所有,欢迎转载请注明出处,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
本主题由 皇帝 5207 于 2009-7-4 11:50:18 执行 主题分类 操作
分享 转发
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
发新话题 回复该主题