win32API 读写ANSI\UNICODE\UNICODE BIG-ENDIAN\UTF-8格式文本

2023-10-24 10:18

本文主要是介绍win32API 读写ANSI\UNICODE\UNICODE BIG-ENDIAN\UTF-8格式文本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include <windows.h>
#include <tchar.h>
#include <cassert>//
//			    读写文件的简单API函数封装
//                  CFileBaseHelper
//                           |
//                  -----------------
//                 |                 |
//          CFileReadHelper   CFileWriteHelper
//
///基类
enum FileTextType
{enANSI,				//enUTF8,				//EF BB BFenUnicode,			//FF FEenUnicodeBigEndian,	//FE FFenUnknown
};class CFileBaseHelper
{
public:CFileBaseHelper( LPCTSTR lpFileName);~CFileBaseHelper();void CloseFile();protected:FileTextType GetFileTextType(LPCTSTR lpFileName );FileTextType m_fttTextType;HANDLE m_hFile;
};CFileBaseHelper::CFileBaseHelper( LPCTSTR lpFileName ):m_fttTextType( enUnknown ), m_hFile( INVALID_HANDLE_VALUE )
{assert( lpFileName != NULL );if( lpFileName == NULL ){return;}m_fttTextType = GetFileTextType(lpFileName);//打开文件m_hFile = CreateFile( lpFileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ,NULL,OPEN_EXISTING, 0, NULL );}CFileBaseHelper::~CFileBaseHelper()
{CloseFile();
}void CFileBaseHelper::CloseFile()
{if( m_hFile != INVALID_HANDLE_VALUE ){CloseHandle( m_hFile );m_hFile = INVALID_HANDLE_VALUE;}
}/*****************************************************************
* 时    间: [2015年11月1日]
* 作    者:shanql
* 函数描述:获取文本类型
* 函数参数:
* 函数返回:
*****************************************************************/
FileTextType CFileBaseHelper::GetFileTextType( LPCTSTR lpFileName )
{if( !lpFileName ){return enUnknown;}FileTextType fttTextType = enUnknown;//open file to read three byte HANDLE hFile = CreateFile( lpFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, NULL, NULL );BYTE cbFlag[3] = { 0 };DWORD dwByteRead = 0;if( INVALID_HANDLE_VALUE != hFile &&ReadFile( hFile, cbFlag, 3, &dwByteRead, NULL )){if( cbFlag[0] == 0xFF &&cbFlag[1] == 0xFE ){fttTextType = enUnicode;}else if ( cbFlag[0] == 0xFE &&cbFlag[1] == 0xFF ){fttTextType = enUnicodeBigEndian;}else if ( cbFlag[0] == 0xEF &&cbFlag[1] == 0xBB &&cbFlag[2] == 0xBF ){fttTextType = enUTF8;}else {fttTextType = enANSI;}}CloseHandle( hFile );return fttTextType;
}///
//读文件类
class CFileReadHelper:public CFileBaseHelper
{
public:CFileReadHelper( LPCTSTR lpFileName);BOOL ReadFile( LPVOID lpBuffer, DWORD dwByteToRead, LPDWORD lpByteRead );	
};CFileReadHelper::CFileReadHelper( LPCTSTR lpFileName ):CFileBaseHelper( lpFileName )
{}BOOL CFileReadHelper::ReadFile( LPVOID lpBuffer, DWORD dwByteToRead, LPDWORD lpByteRead )
{assert( m_hFile != INVALID_HANDLE_VALUE );if( m_hFile == INVALID_HANDLE_VALUE ){return FALSE;}assert( lpBuffer != NULL );if( lpBuffer == NULL ){return FALSE;}BOOL bReadResult = FALSE;switch( m_fttTextType ){case enANSI:{bReadResult = ::ReadFile( m_hFile, lpBuffer, dwByteToRead, lpByteRead, NULL );break;}case enUnicode:case enUnicodeBigEndian:{//跳过前2个标记字节if( INVALID_SET_FILE_POINTER == SetFilePointer( m_hFile, 2, 0, FILE_BEGIN) ){if( GetLastError() != NOERROR ){return FALSE;}}bReadResult = ::ReadFile( m_hFile, lpBuffer, dwByteToRead, lpByteRead, NULL );break;}case enUTF8:{//跳过前3个标记字节if( INVALID_SET_FILE_POINTER == SetFilePointer( m_hFile, 3, 0, FILE_BEGIN) ){if( GetLastError() != NOERROR ){return FALSE;}}bReadResult = ::ReadFile( m_hFile, lpBuffer, dwByteToRead, lpByteRead, NULL );break;}default:{assert( false );return FALSE;}}return bReadResult;
}//
//写文件类
class CFileWriteHelper : public CFileBaseHelper
{
public:CFileWriteHelper( LPCTSTR lpFileName);BOOL WriteFile( LPVOID lpBuffer, DWORD dwByteToWrite, LPDWORD lpByteWrite );
};CFileWriteHelper::CFileWriteHelper( LPCTSTR lpFileName ):CFileBaseHelper( lpFileName )
{}BOOL CFileWriteHelper::WriteFile( LPVOID lpBuffer, DWORD dwByteToWrite, LPDWORD lpByteWrite )
{assert( m_hFile != INVALID_HANDLE_VALUE );if( m_hFile == INVALID_HANDLE_VALUE ){return FALSE;}assert( lpBuffer != NULL );if( lpBuffer == NULL ){return FALSE;}BOOL bWriteResult = FALSE;switch( m_fttTextType ){case enANSI:{bWriteResult = ::WriteFile( m_hFile, lpBuffer, dwByteToWrite, lpByteWrite, NULL );break;}case enUnicode:{	if( INVALID_SET_FILE_POINTER == SetFilePointer( m_hFile, 0, 0, FILE_BEGIN) ){if( GetLastError() != NOERROR ){return FALSE;}}//在文件头先写入两个字节的标记 FF FEDWORD dwWriteHead = 0;BYTE cbHeadFlag[] = { 0xFF, 0xFE };if( !::WriteFile( m_hFile, cbHeadFlag, 2, &dwWriteHead, NULL )){return FALSE;}bWriteResult = ::WriteFile( m_hFile, lpBuffer, dwByteToWrite, lpByteWrite, NULL );break;}case enUnicodeBigEndian:{if( INVALID_SET_FILE_POINTER == SetFilePointer( m_hFile, 0, 0, FILE_BEGIN) ){if( GetLastError() != NOERROR ){return FALSE;}}//在文件头先写入两个字节的标记 FE FFDWORD dwWriteHead = 0;BYTE cbHeadFlag[] = { 0xFE, 0xFF };if( !::WriteFile( m_hFile, cbHeadFlag, 2, &dwWriteHead, NULL )){return FALSE;}bWriteResult = ::WriteFile( m_hFile, lpBuffer, dwByteToWrite, lpByteWrite, NULL );break;}case enUTF8:{if( INVALID_SET_FILE_POINTER == SetFilePointer( m_hFile, 0, 0, FILE_BEGIN) ){if( GetLastError() != NOERROR ){return FALSE;}}//在文件头先写入3个字节的标记 EF BB BFDWORD dwWriteHead = 0;BYTE cbHeadFlag[] = { 0xEF, 0xBB, 0xBF };if( !::WriteFile( m_hFile, cbHeadFlag, 3, &dwWriteHead, NULL )){return FALSE;}bWriteResult = ::WriteFile( m_hFile, lpBuffer, dwByteToWrite, lpByteWrite, NULL );break;}default:{assert( false );return FALSE;}}return bWriteResult;
}//测试函数 
void ReverseFileTest( LPCTSTR lpFileName )
{assert( lpFileName != NULL );if( lpFileName == NULL ){return;}CFileReadHelper tmpFileRead( lpFileName );BYTE szReadBuffer[1024] = { 0 };DWORD dwByteRead = 0;if( !tmpFileRead.ReadFile( szReadBuffer, sizeof(szReadBuffer), &dwByteRead ) ){_tprintf( TEXT("read file failed.\r\n"));return;}tmpFileRead.CloseFile();//可以不调用,析构时会自动调用//反转文件内容INT nStart = 0;INT nEnd = dwByteRead-1;BYTE cbTemp;while( nStart < nEnd ){cbTemp = szReadBuffer[nStart];szReadBuffer[nStart] = szReadBuffer[nEnd];szReadBuffer[nEnd] = cbTemp;++nStart;--nEnd;}//写入文件CFileWriteHelper tmpFileWrite( lpFileName );DWORD dwByteWrite = 0;if( !tmpFileWrite.WriteFile( szReadBuffer, dwByteRead, &dwByteWrite ) ){_tprintf( TEXT("write file failed.\r\n") );return;}tmpFileWrite.CloseFile();//可以不调用,析构时会自动调用
}int main()
{ReverseFileTest(TEXT("test_ansi.txt"));ReverseFileTest(TEXT("test_unicode.txt"));ReverseFileTest(TEXT("test_unicode_big_endian.txt"));ReverseFileTest(TEXT("test_utf8.txt"));return 0;
}


作者:山丘儿
转载请标明出处,谢谢。原文地址:http://blog.csdn.net/s634772208/article/details/49563341

这篇关于win32API 读写ANSI\UNICODE\UNICODE BIG-ENDIAN\UTF-8格式文本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/274477

相关文章

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

Mysql常见的SQL语句格式及实用技巧

《Mysql常见的SQL语句格式及实用技巧》本文系统梳理MySQL常见SQL语句格式,涵盖数据库与表的创建、删除、修改、查询操作,以及记录增删改查和多表关联等高级查询,同时提供索引优化、事务处理、临时... 目录一、常用语法汇总二、示例1.数据库操作2.表操作3.记录操作 4.高级查询三、实用技巧一、常用语

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读