TXT是微软在操作系统上附带的一种文本格式,是最常见的一种文件格式 ,早在DOS时代应用就很多,主要存文本信息,即为文字信息,在微软在操作系统等于直接存,就是它了,现在多用的操作系统得使用记事本等程序保存,大多数软件可以查看,记事本,浏览器等等。文本文件是一种由若干行字符构成的计算机文件。文本文件存在于计算机文件系统中。通常,通过在文本文件最后一行后放置文件结束标志来指明文件的结束。文本文件是指一种容器,而纯文本是指一种内容。文本文件可以包含纯文本。一般来说,计算机文件可以分为两类:文本文件和二进制文件。
TXT文本文件使用范围如此之广,以至于很多文件都是基于此文件生成了各种自定义的文件格式,比如html、xml、dbc、A2L、csv等文件,我们都可以使用TXT文本文件打开,可以查看里面的数据组成方式。不难发现,其实它们都是文本文件,只不过使用了一些特定的组成方式,所以可以使用其他通用软件或者自己开发的软件解析这些数据。
下面以一个简单的例子来对实现对这种文件的操作。
使用工具:VS2008
使用语言:C++
开发步骤:
TxtDataInfo.h
#pragma once
#define SEX_BOY 0
#define SEX_GIRL 1
struct tTXT_DATA_INFO
{
CString sName;//姓名
DWORD dwNumber;//编号
BOOL bSex;//性别
UCHAR ucAge;//年龄
DOUBLE dbScore;//分数
tTXT_DATA_INFO()
{
sName = _T("");
dwNumber= 0;
bSex = SEX_BOY;
ucAge = 0;
dbScore = 0;
}
tTXT_DATA_INFO& operator = (tTXT_DATA_INFO& item)
{
sName = item.sName;
dwNumber= item.dwNumber;
bSex = item.bSex;
ucAge = item.ucAge;
dbScore = item.dbScore;
return* this;
}
};
typedef CArray<tTXT_DATA_INFO,tTXT_DATA_INFO&> ArrTxtDataInfoNodes;
class CTxtDataInfo
{
public:
CTxtDataInfo(void);
~CTxtDataInfo(void);
public:
ArrTxtDataInfoNodes m_arrTxtDataInfo;
DWORD LoadFile(CString sFilePathName);
DWORD SaveFile(CString sFilePathName);
private:
CStdioFile m_TxtFile;//文件记录
DWORD SplitString(CString strSource, CString &strLeft, CString &strRight, char delimiter);
void ReadStudentInfo(CArchive& ar);
void WriteStudentInfo(void);
char* CStringToChar(CString str);
};
TxtDataInfo.cpp
#include "StdAfx.h"
#include "TxtDataInfo.h"
#define TXT_DATA_INFO _T("DATA_INFO")//头标识
#define TXT_DATA_INFO_BEGIN _T("/begin")
#define TXT_DATA_INFO_STUDENT _T("STUDENT")//学生信息
#define TXT_DATA_INFO_NAME _T("NAME")//姓名
#define TXT_DATA_INFO_NUMBER _T("NUMBER")//编号
#define TXT_DATA_INFO_SEX _T("SEX")//性别
#define TXT_DATA_INFO_AGE _T("AGE")//年龄
#define TXT_DATA_INFO_SCORE _T("SCORE")//分数
#define TXT_DATA_INFO_END _T("/end")
CTxtDataInfo::CTxtDataInfo(void)
{
}
CTxtDataInfo::~CTxtDataInfo(void)
{
}
DWORD CTxtDataInfo::LoadFile(CString sFilePathName)
{
m_arrTxtDataInfo.RemoveAll();
if(sFilePathName.IsEmpty())
{
AfxMessageBox(_T("下载文件失败!"));
return 1;
}
CString str = _T("");
CString sName = _T("");
str = sFilePathName;
int w = str.ReverseFind('.');
str = str.Left(w);
w = str.ReverseFind('\\');
w = str.GetLength() - w - 1;
sName = str.Right(w);
CFile file;
CFileException ex;
if(!file.Open(sFilePathName,CFile::modeRead,&ex))
{
str = _T("无法打开:") + sFilePathName;
AfxMessageBox(str);
return 2;
}
CArchive ar(&file,CArchive::load);
CString strKey = _T("");
str = _T("");
while(ar.ReadString(str))
{
str.TrimLeft();
str.TrimRight();
if(str.IsEmpty())
{
continue;
}
if(SplitString(str,strKey,str,' '))
{
continue;
}
if(_T("/begin") == strKey)
{
if(str.IsEmpty())
{
continue;
}
if(SplitString(str,strKey,str,' '))
{
strKey = str;
}
if(_T("DATA_INFO") == strKey)//头标识
{
continue;
}
else if(_T("STUDENT") == strKey)//学生信息
{
ReadStudentInfo(ar);
continue;
}
}
else if(_T("/end") == strKey)//尾标识
{
if(_T("DATA_INFO") == str)
{
break;
}
}
else
{
continue;
}
}
return 0;
}
DWORD CTxtDataInfo::SaveFile(CString sFilePathName)
{
//产生文件
CFileException ex;
if(!m_TxtFile.Open(sFilePathName,CFile::modeCreate | CFile::modeWrite | CFile::typeText,&ex))
{
ex.ReportError();
return 1;
}
CString str = _T("");
//*********生成文件*********
//头标识
str = _T("/begin DATA_INFO");
m_TxtFile.WriteString(str);
str = _T("\n");
m_TxtFile.WriteString(str);
str = _T("\n");
m_TxtFile.WriteString(str);
//学生信息
WriteStudentInfo();
//尾标识
str = _T("/end DATA_INFO");
m_TxtFile.WriteString(str);
str = _T("\n");
m_TxtFile.WriteString(str);
str = _T("\n");
m_TxtFile.WriteString(str);
//*********关闭文件*********
m_TxtFile.Close();
return 0;
}
DWORD CTxtDataInfo::SplitString(CString strSource, CString &strLeft, CString &strRight, char delimiter)
{
int nstrLen = 0;
int nCharPos = 0;
if(strSource.IsEmpty())
{
return 1;
}
strSource.TrimLeft();
strSource.TrimRight();
nstrLen = strSource.GetLength();
nCharPos = strSource.Find(delimiter);
if(-1 == nCharPos)
{
strLeft = _T("");
strRight = strSource;
return 2;
}
else
{
strLeft = strSource.Left(nCharPos);
strRight = strSource.Right(nstrLen - nCharPos - 1);
strRight.TrimLeft();
}
return 0;
}
void CTxtDataInfo::ReadStudentInfo(CArchive& ar)
{
tTXT_DATA_INFO info;
CString str = _T(""), sKey = _T(""), sTemp = _T("");
int i=0, num = 0;
while(ar.ReadString(str))
{
str.TrimLeft();
str.TrimRight();
if(SplitString(str,sKey,str,' '))
{
continue;
}
if((_T("/end") == sKey) && (_T("STUDENT") == str))//学生信息
{
break;
}
else if(_T("NAME") == sKey)//姓名
{
info.sName = str;
continue;
}
else if(_T("NUMBER") == sKey)//编号
{
info.dwNumber = atoi(CStringToChar(str));
continue;
}
else if(_T("SEX") == sKey)//性别
{
info.bSex = atoi(CStringToChar(str));
continue;
}
else if(_T("AGE") == sKey)//年龄
{
info.ucAge = atoi(CStringToChar(str));
continue;
}
else if(_T("SCORE") == sKey)//分数
{
info.dbScore = atof(CStringToChar(str));
continue;
}
else
{
break;
}
}
m_arrTxtDataInfo.Add(info);
}
void CTxtDataInfo::WriteStudentInfo(void)
{
CString str = _T(""), temp = _T("");
CString temp1 = _T("");
int i=0, j=0;
int num = 0;
int cnt = m_arrTxtDataInfo.GetSize();
for(i=0; i<cnt; i++)
{
//学生信息
str = _T("/begin STUDENT");
str = str + _T("\n");
m_TxtFile.WriteString(str);
//姓名
temp = m_arrTxtDataInfo[i].sName;
str = _T("NAME ") + temp;
str = str + _T("\n");
m_TxtFile.WriteString(str);
//编号
temp.Format(_T("%d"),m_arrTxtDataInfo[i].dwNumber);
str = _T("NUMBER ") + temp;
str = str + _T("\n");
m_TxtFile.WriteString(str);
//性别
temp.Format(_T("%d"),m_arrTxtDataInfo[i].bSex);
str = _T("SEX ") + temp;
str = str + _T("\n");
m_TxtFile.WriteString(str);
//年龄
temp.Format(_T("%d"),m_arrTxtDataInfo[i].ucAge);
str = _T("AGE ") + temp;
str = str + _T("\n");
m_TxtFile.WriteString(str);
//分数
temp.Format(_T("%f"),m_arrTxtDataInfo[i].dbScore);
str = _T("SCORE ") + temp;
str = str + _T("\n");
m_TxtFile.WriteString(str);
str = _T("/end STUDENT");
str = str + _T("\n");
m_TxtFile.WriteString(str);
str = _T("\n");
m_TxtFile.WriteString(str);
}
}
char* CTxtDataInfo::CStringToChar(CString str)
{
char *p =(LPSTR)(LPCTSTR)str;
return p;
}FileTxtDemoDlg.h
// FileTxtDemoDlg.h : 头文件
//
#pragma once
#include "TxtDataInfo.h"
#include "afxcmn.h"
// CFileTxtDemoDlg 对话框
class CFileTxtDemoDlg : public CDialog
{
// 构造
public:
CFileTxtDemoDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_FILETXTDEMO_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CTxtDataInfo m_txt;
CListCtrl m_list;
afx_msg void OnBnClickedBtnTxtLoad();
afx_msg void OnBnClickedBtnTxtSave();
afx_msg void OnBnClickedBtnTxtAdd();
afx_msg void OnBnClickedBtnTxtEdit();
afx_msg void OnBnClickedBtnTxtDelete();
void UpdateListData(void);
int m_nSelectItem;
afx_msg void OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult);
};
FileTxtDemoDlg.cpp
// FileTxtDemoDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "FileTxtDemo.h"
#include "FileTxtDemoDlg.h"
#include "DataDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CFileTxtDemoDlg 对话框
CFileTxtDemoDlg::CFileTxtDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFileTxtDemoDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CFileTxtDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_list);
}
BEGIN_MESSAGE_MAP(CFileTxtDemoDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BTN_TXT_LOAD, &CFileTxtDemoDlg::OnBnClickedBtnTxtLoad)
ON_BN_CLICKED(IDC_BTN_TXT_SAVE, &CFileTxtDemoDlg::OnBnClickedBtnTxtSave)
ON_BN_CLICKED(IDC_BTN_TXT_ADD, &CFileTxtDemoDlg::OnBnClickedBtnTxtAdd)
ON_BN_CLICKED(IDC_BTN_TXT_EDIT, &CFileTxtDemoDlg::OnBnClickedBtnTxtEdit)
ON_BN_CLICKED(IDC_BTN_TXT_DELETE, &CFileTxtDemoDlg::OnBnClickedBtnTxtDelete)
ON_NOTIFY(NM_CLICK, IDC_LIST1, &CFileTxtDemoDlg::OnNMClickList1)
END_MESSAGE_MAP()
// CFileTxtDemoDlg 消息处理程序
BOOL CFileTxtDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
//属性设置
m_list.ModifyStyle(LVS_TYPEMASK,LVS_REPORT & LVS_TYPEMASK | LVS_SINGLESEL);//important for show
DWORD dwStyle = m_list.GetExtendedStyle();
m_list.SetExtendedStyle(dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
//设置行距
CImageList image;
image.Create(1,20,ILC_COLOR24 | ILC_MASK,4,0);
m_list.SetImageList(&image,LVSIL_SMALL);
//设置字体
CFont font;
font.CreateFont(
16,
0,
0,
0,
FW_NORMAL,
FALSE,
FALSE,
0,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS,
_T("宋体"));
m_list.SetFont(&font);
m_list.GetHeaderCtrl()->SetFont(&font);
//标题栏
m_list.InsertColumn(0,_T("姓名"),LVCFMT_LEFT,100,0);
m_list.InsertColumn(1,_T("编号"),LVCFMT_LEFT,100,0);
m_list.InsertColumn(2,_T("性别"),LVCFMT_LEFT,100,0);
m_list.InsertColumn(3,_T("年龄"),LVCFMT_LEFT,100,0);
m_list.InsertColumn(4,_T("分数"),LVCFMT_LEFT,100,0);
m_nSelectItem = -1;
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CFileTxtDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CFileTxtDemoDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CFileTxtDemoDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CFileTxtDemoDlg::OnBnClickedBtnTxtLoad()
{
// TODO: 在此添加控件通知处理程序代码
CString sFilePathName = _T("");
CString str = _T(""), s = _T("");
CString sFileType = _T("");
str = _T("txt");
s = _T("txt files(*.txt)|*.txt|所有文件(*.*)|*.*||");
CFileDialog fd(TRUE,str,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR,s,NULL);
if(IDOK == fd.DoModal())
{
sFilePathName = fd.GetPathName();
sFileType = fd.GetFileExt();
if("txt" == sFileType)
{
m_txt.LoadFile(sFilePathName);
UpdateListData();//更新界面
MessageBox(_T("打开文件成功!"));
}
else
{
MessageBox(_T("打开文件失败!"));
}
}
}
void CFileTxtDemoDlg::OnBnClickedBtnTxtSave()
{
// TODO: 在此添加控件通知处理程序代码
CString sFilePathName = _T("");
CString str = _T(""), s = _T("");
CString sFileType = _T("");
str = _T("txt");
s = _T("txt files(*.txt)|*.txt|所有文件(*.*)|*.*||");
CFileDialog fd(FALSE,str,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR,s,NULL);
if(IDOK == fd.DoModal())
{
sFilePathName = fd.GetPathName();
if(-1 == sFilePathName.Find(_T(".txt")))
{
sFilePathName = sFilePathName + _T(".txt");
}
m_txt.SaveFile(sFilePathName);
MessageBox(_T("保存文件成功!"));
}
}
void CFileTxtDemoDlg::OnBnClickedBtnTxtAdd()
{
// TODO: 在此添加控件通知处理程序代码
CDataDlg dlg;
if(IDOK == dlg.DoModal())
{
m_txt.m_arrTxtDataInfo.Add(dlg.m_data);
UpdateListData();
}
}
void CFileTxtDemoDlg::OnBnClickedBtnTxtEdit()
{
// TODO: 在此添加控件通知处理程序代码
if(-1 == m_nSelectItem)
{
return;
}
CDataDlg dlg;
dlg.m_data = m_txt.m_arrTxtDataInfo[m_nSelectItem];
if(IDOK == dlg.DoModal())
{
m_txt.m_arrTxtDataInfo[m_nSelectItem] = dlg.m_data;
UpdateListData();
}
}
void CFileTxtDemoDlg::OnBnClickedBtnTxtDelete()
{
// TODO: 在此添加控件通知处理程序代码
if(-1 == m_nSelectItem)
{
return;
}
m_list.DeleteItem(m_nSelectItem);
m_txt.m_arrTxtDataInfo.RemoveAt(m_nSelectItem);
m_nSelectItem = -1;
}
void CFileTxtDemoDlg::UpdateListData(void)
{
m_list.DeleteAllItems();
CString str = _T("");
BOOL bSex = 0;
int cnt = m_txt.m_arrTxtDataInfo.GetSize();
for(int i=0; i<cnt; i++)
{
//姓名
m_list.InsertItem(i,m_txt.m_arrTxtDataInfo[i].sName);
//编号
str.Format(_T("%d"),m_txt.m_arrTxtDataInfo[i].dwNumber);
m_list.SetItemText(i,1,str);
//性别
bSex = m_txt.m_arrTxtDataInfo[i].bSex;
if(SEX_BOY == bSex)
{
str = _T("男");
}
else if(SEX_GIRL == bSex)
{
str = _T("女");
}
else
{
str = _T("--");
}
m_list.SetItemText(i,2,str);
//年龄
str.Format(_T("%d"),m_txt.m_arrTxtDataInfo[i].ucAge);
m_list.SetItemText(i,3,str);
//分数
str.Format(_T("%f"),m_txt.m_arrTxtDataInfo[i].dbScore);
m_list.SetItemText(i,4,str);
}
}
void CFileTxtDemoDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
//LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
CPoint CursorPoint;
if(!GetCursorPos(&CursorPoint))
{
return;
}
if(-1 == pNMListView->iItem)
{
m_nSelectItem = -1;
return;
}
else
{
m_nSelectItem = pNMListView->iItem;
}
*pResult = 0;
}
DataDlg.h
#pragma once
#include "TxtDataInfo.h"
// CDataDlg 对话框
class CDataDlg : public CDialog
{
DECLARE_DYNAMIC(CDataDlg)
public:
CDataDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CDataDlg();
// 对话框数据
enum { IDD = IDD_DIALOG_DATA };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
tTXT_DATA_INFO m_data;
CString m_sName;
DWORD m_dwNumber;
UCHAR m_ucAge;
DOUBLE m_dbScore;
BOOL m_bSex;
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedRadioBoy();
afx_msg void OnBnClickedRadioGirl();
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
};
DataDlg.cpp
// DataDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "FileTxtDemo.h"
#include "DataDlg.h"
// CDataDlg 对话框
IMPLEMENT_DYNAMIC(CDataDlg, CDialog)
CDataDlg::CDataDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDataDlg::IDD, pParent)
{
m_sName = _T("");
m_dwNumber = 0;
m_ucAge = 0;
m_dbScore = 0;
m_bSex = 0;
}
CDataDlg::~CDataDlg()
{
}
void CDataDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_NAME, m_sName);
DDX_Text(pDX, IDC_EDIT_NUM, m_dwNumber);
DDX_Text(pDX, IDC_EDIT_AGE, m_ucAge);
DDX_Text(pDX, IDC_EDIT_SCORE, m_dbScore);
}
BEGIN_MESSAGE_MAP(CDataDlg, CDialog)
ON_BN_CLICKED(IDC_RADIO_BOY, &CDataDlg::OnBnClickedRadioBoy)
ON_BN_CLICKED(IDC_RADIO_GIRL, &CDataDlg::OnBnClickedRadioGirl)
ON_BN_CLICKED(IDOK, &CDataDlg::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &CDataDlg::OnBnClickedCancel)
END_MESSAGE_MAP()
// CDataDlg 消息处理程序
BOOL CDataDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
UpdateData(TRUE);
m_sName = m_data.sName;
m_dwNumber = m_data.dwNumber;
m_ucAge = m_data.ucAge;
m_dbScore = m_data.dbScore;
m_bSex = m_data.bSex;
if(0 == m_bSex)
{
((CButton*)GetDlgItem(IDC_RADIO_BOY))->SetCheck(TRUE);
((CButton*)GetDlgItem(IDC_RADIO_GIRL))->SetCheck(FALSE);
}
else if(1 == m_bSex)
{
((CButton*)GetDlgItem(IDC_RADIO_BOY))->SetCheck(FALSE);
((CButton*)GetDlgItem(IDC_RADIO_GIRL))->SetCheck(TRUE);
}
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CDataDlg::OnBnClickedRadioBoy()
{
// TODO: 在此添加控件通知处理程序代码
m_bSex = 0;
}
void CDataDlg::OnBnClickedRadioGirl()
{
// TODO: 在此添加控件通知处理程序代码
m_bSex = 1;
}
void CDataDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_data.sName = m_sName;
m_data.dwNumber = m_dwNumber;
m_data.bSex = m_bSex;
m_data.ucAge = m_ucAge;
m_data.dbScore = m_dbScore;
UpdateData(FALSE);
OnOK();
}
void CDataDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
OnCancel();
}
运行程序
打开文件
添加数据
编辑数据
删除数据
保存文件
打开保存的文件
这里我们可以看到,文件就是按照我们自定义的格式生成的。
假如我们不希望文件我们自定义的这个文件后缀名是txt的,那么我们可以自定义我们的文件后缀名,例如,我这里定义我自己文件的后缀名为.abc,然后我们只需要我们打开文件和保存文件的时候查找的后缀名是.abc格式的即可,其他的都不用改变。
将我们的.txt文件改为.abc文件,然后使用我们的软件打开该文件
将这个文件保存为.abc文件
使用记事本打开该文件
我们发现,除了文件后缀名不一样,数据结构都是一样的,这样我们的目的就达到了。
原文:http://blog.csdn.net/bingdianlanxin/article/details/42805023