看流星社区

 找回密码
 注册账号
查看: 2331|回复: 0

文件写入读取和宽字符多字节字符间转换

[复制链接]

该用户从未签到

发表于 2013-2-9 09:24:46 | 显示全部楼层 |阅读模式
// 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;
}
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-4 04:19

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表