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

相关文章

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

Java中使用注解校验手机号格式的详细指南

《Java中使用注解校验手机号格式的详细指南》在现代的Web应用开发中,数据校验是一个非常重要的环节,本文将详细介绍如何在Java中使用注解对手机号格式进行校验,感兴趣的小伙伴可以了解下... 目录1. 引言2. 数据校验的重要性3. Java中的数据校验框架4. 使用注解校验手机号格式4.1 @NotBl