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)
{
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值