码迷,mamicode.com
首页 > 其他好文 > 详细

VS之txt文件操作

时间:2015-01-17 18:13:02      阅读:532      评论:0      收藏:0      [点我收藏+]

标签: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文件

技术分享


使用记事本打开该文件

技术分享

我们发现,除了文件后缀名不一样,数据结构都是一样的,这样我们的目的就达到了。


源码下载


VS之txt文件操作

标签:vs   txt   自定义   操作   

原文地址:http://blog.csdn.net/bingdianlanxin/article/details/42805023

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!