第一范文网 - 专业文章范例文档资料分享平台

VC+ANSI环境下按行读取ANSI、UNICODE+、UNICODE+big+endian、UTF-8四种文本文件

来源:用户分享 时间:2020-06-18 本文由流苏雨 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

2012-04-19 20:07112人阅读评论(0)收藏举报

VC ANSI环境下按行读取ANSI、UNICODE 、UNICODE big endian、UTF-8四种文本文件

1.问题提出

MFC提供的文件类CStdioFile,其中一个函数ReadString实现了文件的按行读取,但是不能满足不同类型的文本文件的按行读取,为了解决这一问题,笔者初步研究了一些编码知识,参考了网上的一些资料,实现了CStdioFile类的扩展类CStdioFileEx,完成了常见文本文件的按行读取(注明:不包括DOC、PDF等其他形式的文档).

在此对网上分享编码经验的网友表示感谢,同时由于我编写的类还未经过严格测试,如有错误或方法过于复杂敬请各位指正。 2.问题解决

(1)四种常见文本文件编码方式研究

ANSI、UNICODE 、UNICODE big endian、UTF-8四种格式编码存在差别,简要介绍如下: ANSI编码:

无文件头(文件编码开头标志性字节)

ANSI编码字母数字占一个字节,汉字占两个字节, 回车换行符单字节 十六进制表示为0d 0a

UNICODE编码:

文件头,十六进制表示为FF FE 每一个字符都用两个字节编码 回车换行符 双字节 000d 000a

Unicode big endian编码: 文件头十六进制表示为FE FF ,

后面编码是把字符的高位放在前面,低位放在后面,正好和Unicode编码颠倒。 回车换行符,双字节,十六进制表示为0d00 0a00

UTF-8 编码:

文件头,十六进制表示为EF BB BF。

UTF-8是Unicode的一种变长字符编码,数字、字母、回车、换行都用一个字节表示,汉字占3个字节. 回车换行符,单字节,十六进制表示为0d 0a

以中文\你好\二字为例,各种类型的编码对应的十六进制格式(可由EditPlus查看)如下图所示:

由此可见上述的探讨是正确的。

(2)按行读取上述四种格式文本文件的解决方案

针对不同文件编码的特点,通过先检测文件头判断文件编码类型,然后根据文件类型分别调用不同的读取函数实现文件的按行读取。按行读取过程如下图所示:

实现过程中,编写CStdioFileEx类,该类继承自CStdioFile类,覆盖了CStdioFile类的BOOL ReadString(CString&rString)方法,从而实现了文件按行读取。 (3)CStdioFileEx类的实现代码 代码清单:

[cpp]view plaincopyprint?

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.

// StdioFileEx.h: interface for the CStdioFileEx class. //

//////////////////////////////////////////////////////////////////////

#if !defined(AFX_STDIOFILEEX_H__C1F1F96B_9417_4388_8D24_892EDFA2A616__INCLUDED_) #define AFX_STDIOFILEEX_H__C1F1F96B_9417_4388_8D24_892EDFA2A616__INCLUDED_

#if _MSC_VER > 1000 #pragma once

#endif // _MSC_VER > 1000

// -------------------------------------------------------------------------------------------- //程序用途:按行读取常见(包括ANSI、UNICODE、UNICODE big endian、UTF-8)格式的文本文件 //程序作者:湖北师范学院计算机科学与技术学院 王定桥

//核心算法:CStdioFileEx继承自CStdioFile, 覆盖CStdioFile的 BOOL ReadString(CString& rString)方法,

// 根据不同文件编码特征,寻找文件回车换行符判断读取行结束,文件结束符判断文件结束 // 检测不同文件编码头部,获取文件类型后调用不同的读取函数 //测试结果:在Windows7 VC6.0环境下测试上述四种格式的txt文件通过

//尚未完成:未重载CStdioFile的 virtual LPTSTR ReadString( LPTSTR lpsz, UINT nMax )方法

// 未完成WriteString方法,未在VC UNICODE 环境下的测试 //制作时间:2012-04-19

//代码版权:代码公开供学习交流使用 欢迎指正错误 改善算法 // -------------------------------------------------------------------------------------------- #include \//文本文件类型枚举值 typedef enum TextCodeType {

UTF8=0, UNICODE =1,

UNICODEBIGENDIAN=2, ANSI=3, FILEERROR=4 }TextCode;

class CStdioFileEx :public CStdioFile { public:

CStdioFileEx();

CStdioFileEx(FILE* pOpenStream);

CStdioFileEx(LPCTSTR lpszFileName, UINT nOpenFlags); virtual ~CStdioFileEx();

virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL); public:

//文件类型值转换到字符串 CString FileTypeToString(); //获取文件类型

TextCode GetFileType();

46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66.

//按行读取文件

BOOL ReadString(CString& rString); //静态方法 获取文件类型

static TextCode GetFileType( LPCTSTR lpszFileName); protected:

TextCode m_FileType;//保存文件类型

const static int PREDEFINEDSIZE;//预定义一行文件所需空间 protected:

//从UTF-8文件按行读取

BOOL ReadStringFromUTF8File(CString& rString); //从ANSI文件按行读取

BOOL ReadStringFromAnsiFile(CString& rString); //重UNCIDOE、UNICODE big endian文件读取

BOOL ReadStringFromUnicodeFile(CString& rString); //UTF-8字符串转换到UNICODE字符串 CString UTF8ToUnicode(byte *szUTF8); //处理文件打开标志

UINT ProcessFlags(LPCTSTR lpszFileName, UINT& nOpenFlags,TextCode &tc); };

#endif // !defined(AFX_STDIOFILEEX_H__C1F1F96B_9417_4388_8D24_892EDFA2A616__INCLUDED_)

// StdioFileEx.h: interface for/////////////////////////////////#if !defined(AFX_STDIOFILEEX_H_ [cpp]view plaincopyprint? 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.

// StdioFileEx.cpp: implementation of the CStdioFileEx class. //

//////////////////////////////////////////////////////////////////////

#include \#include \

#ifdef _DEBUG #undef THIS_FILE

static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif

////////////////////////////////////////////////////////////////////// // Construction/Destruction

////////////////////////////////////////////////////////////////////// /*static*/ const int CStdioFileEx::PREDEFINEDSIZE=1024;

18. 19. 20. 21. 22. 23. 24. 25. 26. 27.

CStdioFileEx::CStdioFileEx():CStdioFile() {

m_FileType=ANSI;//指定默认类型 }

CStdioFileEx::CStdioFileEx(FILE* pOpenStream):CStdioFile(pOpenStream) {

CString filepath=pOpenStream->_tmpfname;//? 尚不清楚File*结构 m_FileType=GetFileType(filepath); }

CStdioFileEx::CStdioFileEx(LPCTSTR lpszFileName, UINT nOpenFlags):CStdioFile(lpszFileName,ProcessFlags(lpszFileName, nOpenFlags,m_FileType) )

28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61.

{ }

CStdioFileEx::~CStdioFileEx() { }

// -------------------------------------------------------------------------------------------- //CStdioFileEx::GetFileType 静态方法 检测文本文件类型

// -------------------------------------------------------------------------------------------- /*static */ TextCode CStdioFileEx::GetFileType(LPCTSTR lpszFileName) {

CFile file;

byte buf[3];//unsigned char TextCode tc; try {

if(file.Open(lpszFileName,CFile::modeRead|CFile::shareDenyNone|CFile::typeBinary)) {

file.Read(buf,3);

if(buf[0]==0xEF && buf[1]==0xBB && buf[2]==0xBF) tc=UTF8; else

if(buf[0]==0xFF && buf[1]==0xFE ) tc=UNICODE ; else

if(buf[0]==0xFE && buf[1]==0xFF ) tc=UNICODEBIGENDIAN; else

tc=ANSI; } else

tc=FILEERROR; }

catch (CFileException ex)

搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新工程科技VC+ANSI环境下按行读取ANSI、UNICODE+、UNICODE+big+endian、UTF-8四种文本文件 全文阅读和word下载服务。

VC+ANSI环境下按行读取ANSI、UNICODE+、UNICODE+big+endian、UTF-8四种文本文件 .doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/1082927.html(转载请注明文章来源)
热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top