logo资料库

VC实现从TXT文件中读取数值型数据.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
VC实现从TXT文件中读取数值型数据
VC 实现从 TXT 文件中读取数值型数据 (2008-06-30 14:11:05) 最近老师经常留用 VC 实现算法的作业,要想做出个界面来就必须从文件中读取大量的数据 (手动输入太累了,神经网络的训练集还是很大的!)。从一个.dat 文件中读取数值数据 并不难,但是建立.dat 文件就不是那么方便了。所以只能用我们常见的 TXT 文件了,在网 上也没找到具体的算法只能自己动手了,初学 VC 还是碰到了很多问题,读取文件就出了很 多错!第一次感觉到编程真的是一件很费脑子的事! 为了以后方便使用,我用一个类实现这个功能,用一个带有 TXT 文件路径参数的构 造函数初始化对象,在初始化的过程中就把 TXT 文件中的数据,以数值的方式存到对象成员 变量中。我用的 CFILE 类实现的读取数据,这个用起来还是比较直观,也可以用一些更基本 的函数实现。设计过程中的关键点主要有下面几个: 1、保存数据的数组要在读取出文件中数据的个数后动态分配内存空间,不浪费 内存。 2、把字符串转换成数组,这里用的是 atof 函数(要包含头文件 stdlib.h)。 3、截取字符串,在 TXT 文件中不存在换行的情况下截取数据字符串还是很简单 的,只要读取到的字符不是数字、小数点、负号等就截取。但是,有时候为了能够更只管的 观察数据,需要保存成矩阵形式,这就需要换行了,TXT 文件换行时包含两个字符,可以用 二进制文件查看器查到,先是回车(ASCII 码为 13)再是换行(ASCII 码为 10),这时就在 截取条件中加入回车,还要要跳过换行字符。 以下是.h 和.cpp 文件中的核心代码,也可以去 http://download.csdn.net/source/423451 下载原文件。 class CFileToArray { public: int GetLengthOfData(); int GetNumOfArray();
double GetDataArray(int num); //读取数组中的数据 CFileToArray(); CFileToArray(CString filename); //带 TXT 文件路径参数的构造函数 virtual ~CFileToArray(); private: CFile DataFile; int NumOfArray; 的数值数据个数 int LengthOfData; 最大长度 double *DataArray; //TXT 文件 //TXT 文件中包含 //数值数据字符串的 //存放数值数据的数据, 这里用的是 DOUBLE 型,可以根据自己需要改变 }; CFileToArray::~CFileToArray() { delete DataArray; //释放内存 } CFileToArray::CFileToArray(CString filename) { char buf; int num=0; //数组元素个数记数 int maxlength=0; //数组元素的最大长度 int length=0; char *Temp; //读取文件时的临时变量 //截取到的每个数据的字符串
DataFile.Open(filename,CFile::modeRead); //打开文件 while(DataFile.Read(&buf,sizeof(char))) //读取文件,每次读取一个字节存在 buf 变量中 { if((buf>=48&&buf<=57)||buf==46||buf==45) { } length++; //统计数据长度 else if(buf==13) //遇到换行跳过无效字节 { num++; //统计数据个数 DataFile.Seek(1,CFile::current); if(length>maxlength) { } maxlength=length; //设定数据最大长度 length=0; } else { num++; if(length>maxlength) //遇到数据间的分隔符统计数据个数,数据最 大长度 { } maxlength=length; length=0; } } LengthOfData=maxlength; //为类中数据长度变量赋值
NumOfArray=num; //为类中数据个数变量赋值 DataArray=new double[num]; //为类中存储数据的数组申请内存空间 Temp=new char[maxlength]; //为临时存储串申请内存空间 int NumOfTemp=0; //临时串记的数变量 int IniNumOfDA=0; //存储数据数组的记数变量 DataFile.SeekToBegin(); //设定文件读取位置,重新从头读取 while(DataFile.Read(&buf,sizeof(char))) { if((buf>=48&&buf<=57)||buf==46||buf==45) Temp[NumOfTemp]=buf; if(NumOfTemp
} else { if(IniNumOfDA
分享到:
收藏