VC实现从TXT文件中读取数值型数据(转)

最近老师经常留用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;                           //TXT文件

int NumOfArray;                         //TXT文件中包含的数值数据个数

int LengthOfData;                      //数值数据字符串的最大长度

double *DataArray;                    //存放数值数据的数据,这里用的是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<maxlength)

    {

     NumOfTemp++;

    }

   

   }

   else if(buf==13)

   {

    DataFile.Seek(1,CFile::current);

    if(IniNumOfDA<num)

    {

     for(int i=NumOfTemp;i<maxlength;i++)

     {

      Temp[NumOfTemp]=NULL;

     }

     DataArray[IniNumOfDA]=atof(Temp);

     IniNumOfDA++;

     NumOfTemp=0;

    }

   }

   else

   {

    if(IniNumOfDA<num)

    {

     for(int i=NumOfTemp;i<maxlength;i++)

     {

      Temp[NumOfTemp]=NULL;

     }

     DataArray[IniNumOfDA]=atof(Temp);

     IniNumOfDA++;

     NumOfTemp=0;

    }

   }

}

DataFile.Close();

delete Temp;

}

posted on 2010-09-26 14:18  carekee  阅读(2552)  评论(0编辑  收藏  举报