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实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

10. 文件的读写

10.1 文本文件 操作文件三大类: ofstream:写操作ifstream:读操作fstream:读写操作 打开方式解释ios::in为了读文件而打开文件ios::out为了写文件而打开文件,如果当前文件存在则清空当前文件在写入ios::app追加方式写文件ios::trunc如果文件存在先删除,在创建ios::ate打开文件之后令读写位置移至文件尾端ios::binary二进制方式

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &