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