我们通常把数据存诸在txt文件上但是我们通常要把这些数据取出来并进行处理下面我将介绍一种在VC++应用程序中读取文本数据的方法
一前言
因为经常要处理地质方面的数据但是很多数据它不是直接存贮在数据库文件(如Access文件等)而是存贮在txt文件经常有同学问我怎么通过编程读取实现文本文件中的数据其实存贮在txt文件也有它的好处不像读取Access文件那样要注册数据源设置比较麻烦编写读取程序也比较复杂
二程序原理
首先我们知道假如要进行的文件操作只是简单的读写整行的字符串那么最好使用CStdioFile用它来进行此类操作非常方便因此我们便很自然想到首先我们把文本文件的每行数据读到一个缓沖区然后使用sscanf把它转化为字符格式
那么具体该怎么做呢?比如在一个txt文件里每一行数据格式是这样的
A A A A ……An
那么读取的主体代码是
CStdioFile File // 定义一个CStdioFile类变量File
CString FileData // 定义一个CString作为一个缓沖区
/*定义n个临时字符串变量大小依据实际情况这里暂设为
*/
char TempStr[]TempStr[]……TempStrN[]
FileReadString(FileData) // 将一行数据读到缓沖区
/*将该行数据的n个字符读到n个临时字符串变量*/
sscanf(FileData%s %s %s %s ……%sTempStrTempStr……TempStrN)
这种读法的一个好处是对文本格式要求不严如下面的格式也可以(前面可有未知个空格) A A (两个数据之间也可有未知个空格) A A ……An
三编程步骤
下面我以一个单文档程序来具体说明我的做法该程序的主要功能是读取文本文件的坐标数据然后在客户区里用直线将这些坐标连起来并显示
启动Visual C++生成一个单文档的工程将该工程命名为ReadCoodinate
添加一个读取文本数据的菜单项
给视图类添加两个public变量
CArray<CPointCPoint> m_PointArray // 用于记录坐标点数据
int m_PointNum // 用于记录坐标点个数在视图类构造函数中初始化为
给读取文本数据添加相应的单击消息响应函数代码如下
void CReadCoodinateViewOnReaddata()
{
// TODO Add your command handler code here
CFileDialog dlg(TRUE) // 定义一个文件对话框变量
if(dlgDoModal()==IDOK)
{
CString m_FilePath = dlgGetPathName() //取得文件路径及文件名
CStdioFile File
FileOpen(m_FilePathCFilemodeRead) //以读模式打开文本文件
CString FileData //定义一个CString变量作为缓沖区
FileReadString(FileData)//读取第一行数据第一行数据为坐标点数据
/*定义两个临时字符串并初始化为\*/
char TempStr[]
char TempStr[]
memset(TempStr\)
memset(TempStr\)
sscanf(FileData%sTempStr)
m_PointNum = atoi(TempStr) // 获取坐标点个数
/*逐行读取坐标数据*/
for (int i = i<m_PointNumi++)
{
FileReadString(FileData)
sscanf(FileData%s %sTempStrTempStr)
m_PointArrayAdd(CPoint(atoi(TempStr)atoi(TempStr)))//将其存入坐标点数组
}
CDC *pDC = GetDC() //获取设备环境
/*根据坐标点绘出直线*/
for (i = i<m_PointNumi++)
{
pDC>MoveTo(m_PointArray[i]xm_PointArray[i]y)
pDC>LineTo(m_PointArray[i+]xm_PointArray[i+]y)
}
ReleaseDC(pDC) //使用完后释放设备环境
}
}
程序运行结果的效果图如下
选取一个txt文件
单击确定后绘制直线如下图
其中示例数据文件的格式是这样的(第一行为坐标个数余下的是坐标点数据)
这个程序的一个优点是对文本数据格式并不严格你可以把数据编辑成下面形式但读出来的效果是一样的(只要x坐标和y坐标中间有一个空格就可以了)
三小结
上面只是小小的示例读者朋友可以将文本数据传化为其它形式的数据(如将字符型数据转化为浮点型)进行更复杂的数据处理其中原理是一样的上面程序的编译环境是WinVC++