MFC操作文本型数据的源码

起因:

最近写了个按键精灵,用于魔兽排战场,特别是虚拟键值和键名的对照表,动作脚本等,数据量不大,就写出了以逗号间隔,每行表示一个记录的形式,为了方便,就写了个操作此类简单数据的CTable。

经过:

结果:

 

//  Table.cpp: implementation of the CTable class.
//
//////////////////////////////////////////////////////////////////////

#include 
" stdafx.h "
#include 
" FileFilter.h "
#include 
" Table.h "

#ifdef _DEBUG
#undef  THIS_FILE
static   char  THIS_FILE[] = __FILE__;
#define  new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
//  Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTable::CTable()
{

}


CTable::
~ CTable()
{
    
for(int i = 0; i < this->Column.GetSize(); i++){
        CStringArray 
* psl = (CStringArray *)Column[i];
        delete psl;
    }

}


UINT CTable::Load(
const  CString  &  sPath, const  CString  & sTag)
{
    CStdioFile f;
    
if(f.Open(sPath,CFile::modeRead)){
        CString sLine;
        CStringArray sl;
        ClearTable(
true);
        
if(f.ReadString(sLine)){
            Slipt(sl,sLine,sTag);
            
for(int i = 0; i < sl.GetSize(); i++){
                AddColumn(sl[i]);
            }

        }
else{
            
return 0xFFFE;
        }

        
while(f.ReadString(sLine)){
            Slipt(sl,sLine,sTag);
            AddRecord(sl);
        }


    }
else
        
return 0xFFFF;
    f.Close();
    
return 0;
}


int  CTable::AddColumn(CString  & sColumn)
{
    ColumnName.Add(sColumn);
    CStringArray 
* pColumn = new CStringArray;
    
if(Column.GetSize() > 0)
        pColumn
->SetSize(((CStringArray * )(Column[0]))->GetSize());
    
return Column.Add(pColumn);
}


int  CTable::Slipt(CStringArray  & StringList,  const  CString  & sSrc,  const  CString  & sFlag)
{
    StringList.RemoveAll();
    LPCSTR pSrc 
= (LPCSTR) sSrc;
    
int pp = 0,ps = 0 ,pe=0;
    
for(pp=0;pp < sSrc.GetLength();pp++){
        
if(pSrc[pp] == ((LPCSTR)(sFlag))[0]){
            CString sTemp;
            StringList.Add(sSrc.Mid(ps,pp 
- ps));
            ps 
= pp +1;
        }

    }

    StringList.Add(sSrc.Mid(ps,pp 
- ps));
    
return StringList.GetSize();
}


UINT CTable::AddRecord(
const  CStringArray  & sRecord)
{
    
if(sRecord.GetSize() <= ColumnName.GetSize()){
        
int i;
        
for(i =0; i < sRecord.GetSize(); i++){
            ((CStringArray 
*)(Column[i]))->Add(sRecord[i]);
        }

        
if(i < ColumnName.GetSize()){
            
for(;i < ColumnName.GetSize(); i++){
                ((CStringArray 
*)(Column[i]))->Add(CString(""));
            }

        }

        
return ((CStringArray *)(Column[0])) ->GetSize();
    }
else{
        
return 0xFFFF;//数据项数比表的字段还多
    }

}


UINT CTable::Save(
const  CString  & sPath,  const  CString  & sTag)
{
    
if(ColumnName.GetSize() == 0)
        
return 0xFFFF;//连字段都没有,空的,直接返回
    CStdioFile f;
    
if(!f.Open(sPath,CFile::modeWrite,NULL))
        
return 0xFFFF;//打开文件出错
    CString sLine;
    
for(int i = 0 ; i < ColumnName.GetSize(); i ++){
        sLine 
+= (ColumnName[i] + CString(","));
    }

    sLine 
= sLine.Left(sLine.GetLength()-1);
    f.WriteString(sLine);
    CStringArray 
* pSL;
    
for(i = 0; i < ((CStringArray *)Column[0])->GetSize(); i ++){
        sLine.Empty();
        
for(int j = 0; j < Column.GetSize(); j++){
            pSL 
= (CStringArray *)Column[j];
            sLine 
+= (pSL->GetAt(i)+ CString(","));
        }

        sLine 
= sLine.Left(sLine.GetLength()-1);
        f.WriteString(sLine);
    }

    
return 0;
}


UINT CTable::ClearTable(
bool  IsFullClear)
{
    
for(int i = 0; i < Column.GetSize(); i++){
        CStringArray 
* psl = (CStringArray *) Column[i];
        psl
->RemoveAll();
    }

    
if(IsFullClear){
        
for(int i = 0; i < Column.GetSize(); i++){
            CStringArray 
* psl = (CStringArray*)Column[i];
            delete psl;
        }

        Column.RemoveAll();
        ColumnName.RemoveAll();
    }

    
return 0;
}


CString CTable::GetValue(
const  CString  & ColumnName,  const   int  Index)
{
    
int Columnindex = GetColumnIndex(ColumnName);
    
if(Columnindex == -1){
        
return CString("");
    }

    CStringArray 
* psl = (CStringArray *)Column[Columnindex];
    
if(psl->GetSize() <= Index)
        
return CString("");
    
return psl->GetAt(Index);
}


int  CTable::GetColumnIndex( const  CString  & ColumnName)
{
    
for(int i = 0; i < this->ColumnName.GetSize(); i++){
        
if((this->ColumnName)[i] == ColumnName){
            
return i;
        }

    }

    
return -1;
}


int  CTable::GetCount()
{
    
if(ColumnName.GetSize()){
        
return ((CStringArray*)Column[0])->GetSize();
    }

    
return -1;
}

//  Table.h: interface for the CTable class.
//
//////////////////////////////////////////////////////////////////////

#if  !defined(AFX_TABLE_H__5ABB29C6_C138_4FA7_8D67_E4BC9D5C8EA5__INCLUDED_)
#define  AFX_TABLE_H__5ABB29C6_C138_4FA7_8D67_E4BC9D5C8EA5__INCLUDED_

#if  _MSC_VER > 1000
#pragma  once
#endif   //  _MSC_VER > 1000

class  CTable  
{
public:
    
int GetCount();
    
int GetColumnIndex(const CString & ColumnName);
    CString GetValue(
const CString & ColumnName,const int Index);
    UINT ClearTable(
bool IsFullClear);
    UINT Save(
const CString & sPath,const CString & sTag);
    UINT AddRecord(
const CStringArray & sRecord);
    
int Slipt(CStringArray& StringList,const CString & sSrc,const CString & sFlag);
    
int AddColumn(CString & sColumn);
    
virtual UINT Load(const CString & sPath,const CString &sTag);
    CTable();
    
virtual ~CTable();
private:
    CStringArray ColumnName;
    CPtrArray Column;

}
;

#endif   //  !defined(AFX_TABLE_H__5ABB29C6_C138_4FA7_8D67_E4BC9D5C8EA5__INCLUDED_)

你可能感兴趣的:(代码留存)