1. 程式人生 > >VS之txt檔案操作

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檔案


使用記事本開啟該檔案


我們發現,除了檔案字尾名不一樣,資料結構都是一樣的,這樣我們的目的就達到了。

原始碼下載