文件写入读取和宽字符多字节字符间转换
2012-06-07 09:43
1251 查看
// SystemFileControl.h: interface for the CSystemFileControl class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SYSTEMFILECONTROL_H__2B1F6337_5FC2_4CC5_A8B2_B1164D0D38D2__INCLUDED_)
#define AFX_SYSTEMFILECONTROL_H__2B1F6337_5FC2_4CC5_A8B2_B1164D0D38D2__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CSystemFileControl
{
public:
CFile fp;
int file_open_type;
CSystemFileControl();
virtual ~CSystemFileControl();
public:
void OpenFile(int openType);
void CloseFile(void);
//*********************系统信息文件结构设置函数*********************//
void SetSYSFILEFlag();//设置信息文件的文件头
void SetHospitalName(CString str);//设置医院名称
void SetHospitalAddress(CString str);//设置医院地址
void SetHospitalPhone(CString str);//设置医院电话
//================系统信息文件信息相关读取函数======================//
int GetSYSFILEFlag(void *lpBuf);//获得系统信息文件的文件头信息
CString GetHospitalName(); //获得医院名称
CString GetHospitalAddress(); //获得医院地址
CString GetHospitalPhone(); //获得医院电话
private:
void CreateNewFile();
};
#endif // !defined(AFX_SYSTEMFILECONTROL_H__2B1F6337_5FC2_4CC5_A8B2_B1164D0D38D2__INCLUDED_)
// SystemFileControl.cpp: implementation of the CSystemFileControl class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Tele-cardiogram.h"
#include "SystemFileControl.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define File_Create_Write 0
#define File_Write_Read 1
#define File_Only_Write 2
#define File_Only_Read 3
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSystemFileControl::CSystemFileControl()
{
file_open_type=0;
}
CSystemFileControl::~CSystemFileControl()
{
}
void CSystemFileControl::OpenFile(int OpenType)
{
BOOL bOk=TRUE;
CString filename;
CString str;
filename="D:\\GY-TELEECG\\SYSFILE.sys";//
switch(OpenType)
{
case 1:
bOk=fp.Open(filename,CFile::modeCreate|CFile::modeWrite);
file_open_type=File_Create_Write;
if(bOk)
SetSYSFILEFlag();
break;
case 2:
bOk=fp.Open(filename,CFile::modeReadWrite);
file_open_type=File_Write_Read;
break;
case 3:
bOk=fp.Open(filename,CFile::modeWrite);
file_open_type=File_Only_Write;
break;
case 4:
bOk=fp.Open(filename,CFile::modeRead);
file_open_type=File_Only_Read;
break;
default:
str=_T("File Doesn't Open!!!");
str=_T("SYSFILE.sys ")+str;
AfxMessageBox(str,MB_OK,0);
return;
break;
}
if(!bOk)
{
if(OpenType==1)
{
str=_T("请在工作目录下运行本应用程序!");
AfxMessageBox(str,MB_OK,0);
exit(0);
}
CreateNewFile();
exit(0);
}
}
void CSystemFileControl::CloseFile()
{
fp.Close();
}
//****************************系统信息文件结构设置函数*********************//
void CSystemFileControl::SetSYSFILEFlag()//设置信息文件的文件头
{
int FileHead_Zero[32];//64字节
fp.Seek(0,CFile::begin);
fp.Write(FileHead_Zero,128);//字
fp.Write("SYSTEM",6);
fp.Write(FileHead_Zero,2);
}
void CSystemFileControl::CreateNewFile()
{
CString str;
//int length;
str=_T("File Can't Open!!!");
str=_T("SYSFILE.sys")+str+_T("\n系统将尝试自动修复!");
AfxMessageBox(str,MB_OK,0);
OpenFile(1);
str=_T("");
SetHospitalName(str);
SetHospitalAddress(str);
SetHospitalPhone(str);
fp.SetLength(500);
CloseFile();
}
void CSystemFileControl::SetHospitalName(CString strHospitalName)//设置医院名称
{
/***********************************
宽字符转换成多字节字符,存取汉字
***********************************/
//获取字符串在多字节下的长度
int dwNum = WideCharToMultiByte(CP_OEMCP,NULL,strHospitalName,-1,NULL,0,NULL,FALSE);
char *psNameText;//多字节字符串buffer
psNameText = new char[dwNum];
if(!psNameText)
{
delete []psNameText;
exit(0);
}
//宽字符转换成多字节字符
WideCharToMultiByte (CP_OEMCP,NULL,strHospitalName,-1,psNameText,dwNum,NULL,FALSE);
fp.Seek(160,CFile::begin);//定位文件,确定写入位置
fp.Write(&dwNum,4); //写入医院名称在多字节下的大小
fp.Write(psNameText,dwNum); //写入医院名称
delete []psNameText;
}
void CSystemFileControl::SetHospitalAddress(CString strHospitalAddr)//设置医院地址
{
fp.Seek(224,CFile::begin);//定位文件,确定写入位置
/***********************************
宽字符转换成多字节字符,存取汉字
***********************************/
//获取字符串在多字节下的长度
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,strHospitalAddr,-1,NULL,0,NULL,FALSE);
char *psNameText;//多字节字符串buffer
psNameText = new char[dwNum];
if(!psNameText)
{
delete []psNameText;
exit(0);
}
//宽字符转换成多字节字符
WideCharToMultiByte (CP_OEMCP,NULL,strHospitalAddr,-1,psNameText,dwNum,NULL,FALSE);
fp.Write(&dwNum,4); //写入医院名称在多字节下的大小
fp.Write(psNameText,dwNum); //写入医院名称
delete []psNameText;
}
void CSystemFileControl::SetHospitalPhone(CString strHospitalPhone)//设置医院电话
{
fp.Seek(384,CFile::begin);//定位文件,确定写入位置
/***********************************
宽字符转换成多字节字符,存取汉字
***********************************/
//获取字符串在多字节下的长度
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,strHospitalPhone,-1,NULL,0,NULL,FALSE);
char *psNameText;//多字节字符串buffer
psNameText = new char[dwNum];
if(!psNameText)
{
delete []psNameText;
exit(0);
}
//宽字符转换成多字节字符
WideCharToMultiByte (CP_OEMCP,NULL,strHospitalPhone,-1,psNameText,dwNum,NULL,FALSE);
fp.Write(&dwNum,4); //写入医院名称在多字节下的大小
fp.Write(psNameText,dwNum); //写入医院名称
fp.SetLength(500);
delete []psNameText;
}
int CSystemFileControl::GetSYSFILEFlag(void *lpBuf)//获得系统信息文件的文件头信息
{
int nCount;
fp.Seek(128,CFile::begin);
nCount=fp.Read(lpBuf,5);
return nCount;
}
CString CSystemFileControl::GetHospitalName()//获得医院名称及其名称长度
{
int nCount=0;//医院名称在多字节下的长度
/***********************************************************/
/* 文件总长度,应该为500,否则文件读取出错 */
/***********************************************************/
int FileSize;
FileSize=fp.GetLength();
if(FileSize!=500)
{
CloseFile();
CreateNewFile();
exit(0);
}
/****************************************/
/* 读取文件 */
/*****************************************/
fp.Seek(160,CFile::begin);
fp.Read(&nCount,4);
char *cTxt;
cTxt= new char[nCount];
fp.Read(cTxt,nCount);
/****************************************/
/* 多字节到宽字节的转换 */
/*****************************************/
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, cTxt, -1, NULL, 0);//宽字节下的医院名称的长度
wchar_t *pwNameText;
pwNameText = new wchar_t[dwNum];
if(!pwNameText)
{
delete []pwNameText;
}
MultiByteToWideChar (CP_ACP, 0, cTxt, -1,pwNameText , dwNum);
/****************************************/
/* 返回宽字节下的医院名称 */
/*****************************************/
CString strHospitalName=pwNameText;
delete []cTxt;
delete []pwNameText;
return strHospitalName;
}
CString CSystemFileControl::GetHospitalAddress()//获得医院地址
{
int nCount=0;//医院地址在多字节下的长度
/***********************************************************/
/* 文件总长度,应该为500,否则文件读取出错 */
/***********************************************************/
int FileSize;
FileSize=fp.GetLength();
if(FileSize!=500)
{
CloseFile();
CreateNewFile();
exit(0);
}
/****************************************/
/* 读取文件 */
/*****************************************/
fp.Seek(224,CFile::begin);
fp.Read(&nCount,4);
char *cTxt;
cTxt= new char[nCount];
fp.Read(cTxt,nCount);
/****************************************/
/* 多字节到宽字节的转换 */
/*****************************************/
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, cTxt, -1, NULL, 0);//宽字节下的医院地址的长度
wchar_t *pwNameText;
pwNameText = new wchar_t[dwNum];
if(!pwNameText)
{
delete []pwNameText;
}
MultiByteToWideChar (CP_ACP, 0, cTxt, -1,pwNameText , dwNum);
/****************************************/
/* 返回宽字节下的医院地址 */
/*****************************************/
CString strHospitalAddr=pwNameText;
delete []cTxt;
delete []pwNameText;
return strHospitalAddr;
}
CString CSystemFileControl::GetHospitalPhone()//获得医院电话
{
int nCount=0;//医院电话在多字节下的长度
/***********************************************************/
/* 文件总长度,应该为500,否则文件读取出错 */
/***********************************************************/
int FileSize;
FileSize=fp.GetLength();
if(FileSize!=500)
{
CloseFile();
CreateNewFile();
exit(0);
}
/****************************************/
/* 读取文件 */
/*****************************************/
fp.Seek(384,CFile::begin);
fp.Read(&nCount,4);
char *cTxt;
cTxt= new char[nCount];
fp.Read(cTxt,nCount);
/****************************************/
/* 多字节到宽字节的转换 */
/*****************************************/
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, cTxt, -1, NULL, 0);//宽字节下的医院电话的长度
wchar_t *pwNameText;
pwNameText = new wchar_t[dwNum];
if(!pwNameText)
{
delete []pwNameText;
}
MultiByteToWideChar (CP_ACP, 0, cTxt, -1,pwNameText , dwNum);
/****************************************/
/* 返回宽字节下的医院电话 */
/*****************************************/
CString strHospitalPhone=pwNameText;
delete []cTxt;
delete []pwNameText;
return strHospitalPhone;
}
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SYSTEMFILECONTROL_H__2B1F6337_5FC2_4CC5_A8B2_B1164D0D38D2__INCLUDED_)
#define AFX_SYSTEMFILECONTROL_H__2B1F6337_5FC2_4CC5_A8B2_B1164D0D38D2__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CSystemFileControl
{
public:
CFile fp;
int file_open_type;
CSystemFileControl();
virtual ~CSystemFileControl();
public:
void OpenFile(int openType);
void CloseFile(void);
//*********************系统信息文件结构设置函数*********************//
void SetSYSFILEFlag();//设置信息文件的文件头
void SetHospitalName(CString str);//设置医院名称
void SetHospitalAddress(CString str);//设置医院地址
void SetHospitalPhone(CString str);//设置医院电话
//================系统信息文件信息相关读取函数======================//
int GetSYSFILEFlag(void *lpBuf);//获得系统信息文件的文件头信息
CString GetHospitalName(); //获得医院名称
CString GetHospitalAddress(); //获得医院地址
CString GetHospitalPhone(); //获得医院电话
private:
void CreateNewFile();
};
#endif // !defined(AFX_SYSTEMFILECONTROL_H__2B1F6337_5FC2_4CC5_A8B2_B1164D0D38D2__INCLUDED_)
// SystemFileControl.cpp: implementation of the CSystemFileControl class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Tele-cardiogram.h"
#include "SystemFileControl.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define File_Create_Write 0
#define File_Write_Read 1
#define File_Only_Write 2
#define File_Only_Read 3
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSystemFileControl::CSystemFileControl()
{
file_open_type=0;
}
CSystemFileControl::~CSystemFileControl()
{
}
void CSystemFileControl::OpenFile(int OpenType)
{
BOOL bOk=TRUE;
CString filename;
CString str;
filename="D:\\GY-TELEECG\\SYSFILE.sys";//
switch(OpenType)
{
case 1:
bOk=fp.Open(filename,CFile::modeCreate|CFile::modeWrite);
file_open_type=File_Create_Write;
if(bOk)
SetSYSFILEFlag();
break;
case 2:
bOk=fp.Open(filename,CFile::modeReadWrite);
file_open_type=File_Write_Read;
break;
case 3:
bOk=fp.Open(filename,CFile::modeWrite);
file_open_type=File_Only_Write;
break;
case 4:
bOk=fp.Open(filename,CFile::modeRead);
file_open_type=File_Only_Read;
break;
default:
str=_T("File Doesn't Open!!!");
str=_T("SYSFILE.sys ")+str;
AfxMessageBox(str,MB_OK,0);
return;
break;
}
if(!bOk)
{
if(OpenType==1)
{
str=_T("请在工作目录下运行本应用程序!");
AfxMessageBox(str,MB_OK,0);
exit(0);
}
CreateNewFile();
exit(0);
}
}
void CSystemFileControl::CloseFile()
{
fp.Close();
}
//****************************系统信息文件结构设置函数*********************//
void CSystemFileControl::SetSYSFILEFlag()//设置信息文件的文件头
{
int FileHead_Zero[32];//64字节
fp.Seek(0,CFile::begin);
fp.Write(FileHead_Zero,128);//字
fp.Write("SYSTEM",6);
fp.Write(FileHead_Zero,2);
}
void CSystemFileControl::CreateNewFile()
{
CString str;
//int length;
str=_T("File Can't Open!!!");
str=_T("SYSFILE.sys")+str+_T("\n系统将尝试自动修复!");
AfxMessageBox(str,MB_OK,0);
OpenFile(1);
str=_T("");
SetHospitalName(str);
SetHospitalAddress(str);
SetHospitalPhone(str);
fp.SetLength(500);
CloseFile();
}
void CSystemFileControl::SetHospitalName(CString strHospitalName)//设置医院名称
{
/***********************************
宽字符转换成多字节字符,存取汉字
***********************************/
//获取字符串在多字节下的长度
int dwNum = WideCharToMultiByte(CP_OEMCP,NULL,strHospitalName,-1,NULL,0,NULL,FALSE);
char *psNameText;//多字节字符串buffer
psNameText = new char[dwNum];
if(!psNameText)
{
delete []psNameText;
exit(0);
}
//宽字符转换成多字节字符
WideCharToMultiByte (CP_OEMCP,NULL,strHospitalName,-1,psNameText,dwNum,NULL,FALSE);
fp.Seek(160,CFile::begin);//定位文件,确定写入位置
fp.Write(&dwNum,4); //写入医院名称在多字节下的大小
fp.Write(psNameText,dwNum); //写入医院名称
delete []psNameText;
}
void CSystemFileControl::SetHospitalAddress(CString strHospitalAddr)//设置医院地址
{
fp.Seek(224,CFile::begin);//定位文件,确定写入位置
/***********************************
宽字符转换成多字节字符,存取汉字
***********************************/
//获取字符串在多字节下的长度
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,strHospitalAddr,-1,NULL,0,NULL,FALSE);
char *psNameText;//多字节字符串buffer
psNameText = new char[dwNum];
if(!psNameText)
{
delete []psNameText;
exit(0);
}
//宽字符转换成多字节字符
WideCharToMultiByte (CP_OEMCP,NULL,strHospitalAddr,-1,psNameText,dwNum,NULL,FALSE);
fp.Write(&dwNum,4); //写入医院名称在多字节下的大小
fp.Write(psNameText,dwNum); //写入医院名称
delete []psNameText;
}
void CSystemFileControl::SetHospitalPhone(CString strHospitalPhone)//设置医院电话
{
fp.Seek(384,CFile::begin);//定位文件,确定写入位置
/***********************************
宽字符转换成多字节字符,存取汉字
***********************************/
//获取字符串在多字节下的长度
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,strHospitalPhone,-1,NULL,0,NULL,FALSE);
char *psNameText;//多字节字符串buffer
psNameText = new char[dwNum];
if(!psNameText)
{
delete []psNameText;
exit(0);
}
//宽字符转换成多字节字符
WideCharToMultiByte (CP_OEMCP,NULL,strHospitalPhone,-1,psNameText,dwNum,NULL,FALSE);
fp.Write(&dwNum,4); //写入医院名称在多字节下的大小
fp.Write(psNameText,dwNum); //写入医院名称
fp.SetLength(500);
delete []psNameText;
}
int CSystemFileControl::GetSYSFILEFlag(void *lpBuf)//获得系统信息文件的文件头信息
{
int nCount;
fp.Seek(128,CFile::begin);
nCount=fp.Read(lpBuf,5);
return nCount;
}
CString CSystemFileControl::GetHospitalName()//获得医院名称及其名称长度
{
int nCount=0;//医院名称在多字节下的长度
/***********************************************************/
/* 文件总长度,应该为500,否则文件读取出错 */
/***********************************************************/
int FileSize;
FileSize=fp.GetLength();
if(FileSize!=500)
{
CloseFile();
CreateNewFile();
exit(0);
}
/****************************************/
/* 读取文件 */
/*****************************************/
fp.Seek(160,CFile::begin);
fp.Read(&nCount,4);
char *cTxt;
cTxt= new char[nCount];
fp.Read(cTxt,nCount);
/****************************************/
/* 多字节到宽字节的转换 */
/*****************************************/
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, cTxt, -1, NULL, 0);//宽字节下的医院名称的长度
wchar_t *pwNameText;
pwNameText = new wchar_t[dwNum];
if(!pwNameText)
{
delete []pwNameText;
}
MultiByteToWideChar (CP_ACP, 0, cTxt, -1,pwNameText , dwNum);
/****************************************/
/* 返回宽字节下的医院名称 */
/*****************************************/
CString strHospitalName=pwNameText;
delete []cTxt;
delete []pwNameText;
return strHospitalName;
}
CString CSystemFileControl::GetHospitalAddress()//获得医院地址
{
int nCount=0;//医院地址在多字节下的长度
/***********************************************************/
/* 文件总长度,应该为500,否则文件读取出错 */
/***********************************************************/
int FileSize;
FileSize=fp.GetLength();
if(FileSize!=500)
{
CloseFile();
CreateNewFile();
exit(0);
}
/****************************************/
/* 读取文件 */
/*****************************************/
fp.Seek(224,CFile::begin);
fp.Read(&nCount,4);
char *cTxt;
cTxt= new char[nCount];
fp.Read(cTxt,nCount);
/****************************************/
/* 多字节到宽字节的转换 */
/*****************************************/
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, cTxt, -1, NULL, 0);//宽字节下的医院地址的长度
wchar_t *pwNameText;
pwNameText = new wchar_t[dwNum];
if(!pwNameText)
{
delete []pwNameText;
}
MultiByteToWideChar (CP_ACP, 0, cTxt, -1,pwNameText , dwNum);
/****************************************/
/* 返回宽字节下的医院地址 */
/*****************************************/
CString strHospitalAddr=pwNameText;
delete []cTxt;
delete []pwNameText;
return strHospitalAddr;
}
CString CSystemFileControl::GetHospitalPhone()//获得医院电话
{
int nCount=0;//医院电话在多字节下的长度
/***********************************************************/
/* 文件总长度,应该为500,否则文件读取出错 */
/***********************************************************/
int FileSize;
FileSize=fp.GetLength();
if(FileSize!=500)
{
CloseFile();
CreateNewFile();
exit(0);
}
/****************************************/
/* 读取文件 */
/*****************************************/
fp.Seek(384,CFile::begin);
fp.Read(&nCount,4);
char *cTxt;
cTxt= new char[nCount];
fp.Read(cTxt,nCount);
/****************************************/
/* 多字节到宽字节的转换 */
/*****************************************/
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, cTxt, -1, NULL, 0);//宽字节下的医院电话的长度
wchar_t *pwNameText;
pwNameText = new wchar_t[dwNum];
if(!pwNameText)
{
delete []pwNameText;
}
MultiByteToWideChar (CP_ACP, 0, cTxt, -1,pwNameText , dwNum);
/****************************************/
/* 返回宽字节下的医院电话 */
/*****************************************/
CString strHospitalPhone=pwNameText;
delete []cTxt;
delete []pwNameText;
return strHospitalPhone;
}
相关文章推荐
- 解决ConfigParser模块读取、写入文件时自动转换为小写字符的问题
- C++实现文件简单加密与解密(读取文件中的字符,对字符转换,然后写入,完成加密,解密反之)
- python读取文件并转换成字节数组
- 怎么将一个整个文件一次读到内存,然后循环从内存中读取1024字节,写入新的文件(或socket发送出去)
- 字节字符和整数转换-大小端转换-结构体内存(文件)对齐规则之总结
- Java 文件写入读取统计字符
- io文件操作(多种读取方式-字节,字符,行,随机)
- Java之基于字符流的文件写入与读取
- Java 文件字节字符数据转换
- 通过字符流来对文件进行内容的读取和写入操作
- C语言读取输入的字符并写入到文件中
- Unicode(UTF16)文件读写终极方案---用C++标准的字节流读取,转化为宽字符(wchar_t),再以字节流写入
- 【Java】运用多种方式读取文件内容,包括按字节、字符和按行为单位读取文件内容
- java字节流和字符流操作文件,指定编码写入和读取,递归创建上层目录
- Java io文件操作(按字符、字节、行、随机读取,追加,文件操作)
- 通过java字节流复制文件,逐个字节读取写入
- 字节写入读出//字符读取写入//带缓存读取写入
- <BIO>以字节的方式(写入,读取)文本,以字符的方式(写入,读取)文本和<NIO>的写入,读取
- java读取写入图片文件、byte[]、base64字符串、16进制字符串相互转换
- Unicode(UTF16)文件读写终极方案---用C++标准的字节流读取,转化为宽字符(wchar_t),再以字节流写入