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)
{