VS之txt檔案操作
TXT是微軟在作業系統上附帶的一種文字格式,是最常見的一種檔案格式 ,早在DOS時代應用就很多,主要存文字資訊,即為文字資訊,在微軟在作業系統等於直接存,就是它了,現在多用的作業系統得使用記事本等程式儲存,大多數軟體可以檢視,記事本,瀏覽器等等。文字檔案是一種由若干行字元構成的計算機檔案。文字檔案存在於計算機檔案系統中。通常,通過在文字檔案最後一行後放置檔案結束標誌來指明檔案的結束。文字檔案是指一種容器,而純文字是指一種內容。文字檔案可以包含純文字。一般來說,計算機檔案可以分為兩類:文字檔案和二進位制檔案。
TXT文字檔案使用範圍如此之廣,以至於很多檔案都是基於此檔案生成了各種自定義的檔案格式,比如html、xml、dbc、A2L、csv等檔案,我們都可以使用TXT文字檔案開啟,可以檢視裡面的資料組成方式。不難發現,其實它們都是文字檔案,只不過使用了一些特定的組成方式,所以可以使用其他通用軟體或者自己開發的軟體解析這些資料。
下面以一個簡單的例子來對實現對這種檔案的操作。
使用工具:VS2008
使用語言:C++
開發步驟:
1.新建對話方塊應用程式
2.設定資料結構體和新增資料處理類
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; }
3.新增資料顯示介面
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;
}
4.新增資料操作介面
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();
}
5.文件結構
6.效果演示
執行程式
開啟檔案
新增資料
編輯資料
刪除資料
儲存檔案
開啟儲存的檔案
這裡我們可以看到,檔案就是按照我們自定義的格式生成的。
7.自定義字尾名操作
假如我們不希望檔案我們自定義的這個檔案字尾名是txt的,那麼我們可以自定義我們的檔案字尾名,例如,我這裡定義我自己檔案的字尾名為.abc,然後我們只需要我們開啟檔案和儲存檔案的時候查詢的字尾名是.abc格式的即可,其他的都不用改變。
將我們的.txt檔案改為.abc檔案,然後使用我們的軟體開啟該檔案
將這個檔案儲存為.abc檔案
使用記事本開啟該檔案
我們發現,除了檔案字尾名不一樣,資料結構都是一樣的,這樣我們的目的就達到了。