, .
, , , ( ). () . ( ) , , .
: , , - , . .
, , -.
. . . , .
, . . 1. , , .
. 1.
. , . , , . .
. , . , : , , , .. .
, :
- // /;
- /// ;
- ;
- .
.
. , ( , ..), , .
|
|
. , . , , .. .
1. . CVariant
. .
. ( Variant type) , . COM.
Object Pascal (IDE Delphi):
procedure VariantTest();
Var
v: Variant;
Begin
v:=5; // v 5
v:='abc'; // v abc
v:=6.1; // v 6.1
end;
.
, , , (1 ), :
enum VarType {vtNone, vtInt, vtFloat, vtChar, vtStr};
, .
CVariant :
class CVariant
{protected:
VarType type;
union VariantData
{ int i;
float f;
char c;
char* pc;
} datum;
void StrDealloc()
{ if(type==vtStr) delete [] datum.pc; };
public:
CVariant& operator=(const CVariant& v);
CVariant() { type=vtNone; };
CVariant& operator=(float f);
CVariant& operator=(int i);
CVariant& operator=(char c);
CVariant& operator=(char* pc);
virtual ~CVariant() { StrDealloc(); };
VarType GetType() { return type; };
operator int();
operator float();
operator char();
operator char*();
};
(protected) ( VarType type) ( VariantData datum, VariantData ).
CVariant , datum.pc ( ) . StrDealloc() , /.
StrDealloc() , (inline) -. , . . : inline int Get5() { return 5; } 5. |
|
|
(public) , , GetType(), .
. , (vtNone) . |
(=) , :
CVariant v;
int i=5;
v=i;
, = :
CVariant& CVariant::operator =(int i)
{ StrDealloc(); //
type=vtInt; //
datum.i=i; //
return *this; //
};
= , . . :
CVariant v;
int i=5, j;
j=v=i; // : j==5, v==5, v.type==vtInt
, :
CVariant v=5;
int i;
i=v;
, int :
CVariant::operator int()
{ switch(type) //
{case vtChar:
return datum.c; //
case vtInt:
return datum.i; //
case vtFloat:
return static_cast<int>(datum.f); //
case vtStr:
return *datum.pc; //
}
return 0; // 0
};
, .. . .
( , ) , , .
= , , . (conversion constructors) . : CVariant v; v=abcd; // , char* pc=v; // pc , v.datum.pc std::cout<<pc; // pc : - - CVariant(char*) abcd; - v ; - . . , : CVariant& CVariant::operator=(const CVariant &v) { StrDealloc(); type=v.type; if(type!=vtStr) datum=v.datum; else { datum.pc=new char[strlen(v.datum.pc)+1]; strcpy(datum.pc,v.datum.pc); } return *this; } , , . , , v.datum.pc . , . . v. , , .. . . : #ifdef ConversionByConstructor #else #endif |
|
|
.
- : CVariant.h, CVariant.cpp.
- CVariant.
.
- , CVariant ?
- , , CVariant.
2.
( ) , () . .. , , .
- , - . .
. :
- ;
- , - .
, (, ) , , , .. . 2.
. 2.
, . . . 3.
. 3. ,
- (static) . , , .. . |
, .
CListInfo, :
class CListInfo
{ int RefCount;
bool Sorted;
int SortCriterion;
CSimpList* FirstElement;
CSimpList* LastElement;
void Inc() { RefCount++; };
void Dec() { RefCount--; if(RefCount<=0) delete this; }; // -
CListInfo(CSimpList* List) { RefCount=SortCriterion=0;
Sorted=false;
FirstElement=LastElement=List;
};
friend CSimpList;
};
CListInfo :
- RefCount ( ).
- Sorted, SortCriterion , . , , . , , .
|
|
- FirstElement, LastElement .
/ Inc() Dec(), RefCount (.. ) . (. CSimpList).
COM (Component Object Model). COM ActiveX. |
CListInfo (private ), .. . CSimpList, (friend), . , CListInfo .
CSimpList, :
class CSimpList
{protected:
CSimpList* next; //
CSimpList* prev; //
CListInfo* ListInfo; //
void BubbleUp(); // .
// , ,
public:
CSimpList(CSimpList *List = NULL); //
virtual ~CSimpList(); //
// :
virtual bool operator==(CSimpList &List) = 0;
virtual bool operator>(CSimpList &List) = 0;
virtual bool operator<(CSimpList &List) = 0;
// :
virtual CSimpList* Next() { return next; };
virtual CSimpList* Prev() { return prev; };
virtual CSimpList* First() { return ListInfo->FirstElement; };
virtual CSimpList* Last() { return ListInfo->LastElement; };
int Count() { return ListInfo->RefCount; }; //
// :
virtual bool Add(CSimpList* Elem);
virtual CSimpList* Remove();
virtual CSimpList* Sort(int Criterion = 0); //
int SortCriterion() { return ListInfo->SortCriterion; }; //
};
, , .
.
(prev next), , (ListInfo). protected, , , -. , prev / next , / .
List*, , , ( ), . , .
:
CSimpList::CSimpList(CSimpList *List)
{ next=prev=NULL; // /
if(List) // List (.. , )
{ ListInfo=NULL;
List->Add(this); //
}
else // List
{ ListInfo=new CListInfo(this); //
ListInfo->Inc(); //
}
};
:
CSimpList::~CSimpList()
{
ListInfo->Dec();
};
CSimpList . , , , . ( ):
A *a;
B *b;
b=new B;
a=b;
delete a;
.
, - CSimpList ~CSimpList() .
|
|
(pure virtual), . , , . .
-. . , CSimpList , .. . , , , . . |
/ / .
Count, , , RefCount . / .
.
:
CSimpList* CSimpList::Remove()
{ if(next || prev) //
{ if(!next) //
{ // , , :
ListInfo->LastElement=prev;
prev->next=NULL;
}
else if(!prev) //
{ // , , :
ListInfo->FirstElement=next;
next->prev=NULL;
}
else // ,
{ // :
next->prev=prev;
prev->next=next;
}
CListInfo *tmpListInfo=ListInfo;
ListInfo->Dec(); //
prev=next=NULL; //
ListInfo=new CListInfo(this); //
ListInfo->Inc();
return tmpListInfo->FirstElement; // ,
}
return NULL;
}
, , . , . .
:
bool CSimpList::Add(CSimpList* Elem)
{ if(Elem && Elem->ListInfo!=ListInfo) // Elem
{ if(Elem->Count()>1) //
return false;
// Elem :
ListInfo->LastElement->next=Elem;
Elem->prev=ListInfo->LastElement;
Elem->next=NULL;
Elem->ListInfo=ListInfo;
ListInfo->LastElement=Elem;
ListInfo->Inc(); //
ListInfo->Sorted=false; //
return true;
}
return false;
}
Remove() , Add() , , :
CSimpList *a,*b;
// a b
CSimpList *c=a; // , (1)
a=c->Remove(); // (2)
b.Add(&c); // b
. , ( a (1)). , ( a (2) , ).
CSimpList - >.
BubbleUp(), ( ):
void CSimpList::BubbleUp()
{ if(next) //
{ if(prev) //
prev->next=next; //
else
ListInfo->FirstElement=next; //
next->prev=prev; //
if(next->next) //
next->next->prev=this; //
else
ListInfo->LastElement=this; //
prev=next; //
next=next->next; //
prev->next=this; // ,
}
ListInfo->Sorted=false; //
}
. .
Sort(), , . , , , , . Sort() Criterion .
CSimpList* CSimpList::Sort(int Criterion)
{ if(ListInfo->SortCriterion!=Criterion ||!ListInfo->Sorted) //
{ ListInfo->SortCriterion=Criterion; //
CSimpList* le; //
bool swapped; // ,
do
{ le=ListInfo->FirstElement; //
swapped=false; //
// :
while(le->next) //
{ if(*le>*le->next) // le
{ le->BubbleUp(); // le
swapped=true; // ,
}
else //
le=le->next; //
}
} while(swapped); // ,
ListInfo->Sorted=true; //
}
return ListInfo->FirstElement; //
};
CSimpList:
class CSomeList: public CSimpList
{public:
int i,j; // ,
CSomeList(CSomeList* List=NULL): CSimpList(List) {} //
bool operator==(CSimpList &List) { }; //
bool operator<(CSimpList &List) { }; // <
bool operator>(CSimpList &List) // >
{ if(SortCriterion()==0) // i
return i > (static_cast<CSomeList&>(List).i);
else // j
return j > (static_cast<CSomeList&>(List).j);
};
CSomeList* Sort(int Criterion = 0) //
{ return static_cast<CSomeList*>(CSimpList::Sort(Criterion)); };
void Show(); //
//
};
> , , i, j . static_cast<CSomeList&> .
Sort() . , . , ( CSomeClass::Sort()).
CSimpList, CSimpList*. , , / .
.
- : CSimpList.h, CSimpList.cpp.
- . -, .
.
- > (, , <). , . . (.. , ==) . , - - , . ?
- , , (. ). CSimpList ?
3. .
, .
- , , . , , .
XML (eXtensible Markup Language ). , . 1 .
, . , , :
<table Name= >
<fields>
<field ID=1 type=Integer>
</field>
<field name=2 type=String length=32>
</field>
</fields>
<records>
<record>
<value field=1>
56234
</value>
<value field=2>
..
</value>
</record>
<record>
<value field=1>
56233
</value>
<value field=2>
..
</value>
</record>
</records>
</table>
(tag , , .) , . - . , :
<TagName>
</TagName>,
, .
():
<TagName attrib1=value1 attrib2=value2>,
attribXX , valueXX .
, .. :
<Tag1> <Tag2> </Tag1> </Tag2>.
<table>-</table> , <fields>-</fields> - , <field>-</field> - ..
, . . :
- , . , .
- . , . , . , , .
CFileParser, :
using namespace std; //
class CFileParser
{ // :
string FileName; // (. ). . string
string CurTagName; //
string ParamString; //
bool TagCached; // , ( , )
fstream SourceFile; //
void FormatParamString(); //
public:
explicit CFileParser(const char *FileName); // , c
bool GetStartTag(const char* TagName); //
bool GetStopTag(const char* TagName); //
bool GetTagBody(const char* TagName, char* Dest, int &DestLen); //
// :
bool GetTagParam(const char* TagName, const char* ParamName, char* Dest, int &DestLen);
fstream &PrepareWriting(); //
};
:
- , ;
- PrepareWriting(), fstream. . PrepareWriting() .
, . explicit , .
GetStartTag() <TagName >. , . , , , ().
GetStopTag() . GetStartTag(Tag) GetStopTag(Tag).
GetTagBody() Dest DestLen , c <. DestLen . ( ).
GetTagParam() Dest ( DestLen ). DestLen . ( ).
GetTagParam() FormatParamString(), .
PrepareWriting() , . fstream, . , .
.
1. : CFileParser.h, CFileParser.cpp.
2. : , , .
3. , : ( ); ( ).
.
1. , . , . .
4. : CField
, , CField. .. , CField CSimpList.
CField :
- ;
- ;
- ;
- ;
- : , , .
CField:
#define vtAuto vtNone; // vtNone (. VarType CVariant.h - variant type)
class CField: public CSimpList
{ CField* GetByOffsetIndex(int OffsetIndex) // , OffsetIndex
{ if(!OffsetIndex) return this;
if(!next) return NULL;
return static_cast<CField*>(next)->GetByOffsetIndex(OffsetIndex-1);
}
public:
VarType FieldType; // vtAuto (.. vtNone) ,
char FieldName[32]; //
static unsigned int AutoNextVal; //
int OutputOrder; //
int FieldLen; // ( )
bool Visible; //
int GetIndexByOrder(int OrderNum); //
bool SetNewOrd(int OldOrd, int NewOrd); // OldOrd NewOrd
CField* operator[](int index) //
{ return static_cast<CField*>(First())->GetByOffsetIndex(index);
};
bool LoadFromFile(CFileParser &DataFile); //
bool SaveToFile(fstream &DataFile); //
// :
bool operator==(CSimpList &List) { return true;}
bool operator< (CSimpList &List) { return false;}
bool operator> (CSimpList &List) { return false;}
virtual bool Add(CField* Elem);
virtual CField* Remove();
CField(CField *List = NULL);
~CField(void);
};
FieldType VarType, (CVariant). . (vtNone) , vtAuto. . . AutoNextVal, .
. CField . CField . , () (. CRecord ) .
FieldName. ( ):
- OutputOrder . , .. , (. CRecord). , ;
- FieldLen ;
- Visible () . , .
:
- GetIndexByOrder () ;
- SetNewOrd . , , , . . , SetNewOrd(0,2) ;
- Add, Remove . CSimpList::Add() CSimpList::Remove() .
:
- operator[] , ;
- GetByOffsetIndex , , . .
/ :
- LoadFromFile ;
- SaveToFile .
, .. . , , , Sort() . , .. Sort() .
.
- : CField.h, CField.cpp.
.
1. . CField.
5. : CRecord
, , CRecord, .
.
CRecord CField, .. , .
CVariant, .
, , , .
, CRecord . .
CField, CRecord .
, . .
Sort() CSimpList , . . , , , .
, Sort() , SortCriterion. . , , .. . 4.2 CSomeList.
.
- CRecord.
6. : CSimpTable
, . CSimpList, .
class CSimpTable: public CSimpList
{ CField *Fields; //
// CRecord *Records; //
char TableName[32]; //
public:
CSimpTable(CSimpTable *List = NULL);
~CSimpTable(void);
// :
bool LoadFromFile(CFileParser &DataFile);
bool SaveToFile(fstream &DataFile);
// :
bool operator==(CSimpList &List) { return true;}
bool operator< (CSimpList &List) { return false;}
bool operator> (CSimpList &List) { return false;}
};
.
: , . , , .
:
#include <iostream>
#include "CFileParser.h"
#include "csimptable.h"
int _tmain(int argc, _TCHAR* argv[])
{ CSimpTable table; //
CFileParser file("infile.txt"); // ,
table.LoadFromFile(file); //
fstream& outfile=file.PrepareWriting(); //
table.SaveToFile(outfile); //
}
infile.txt :
<table>
testTable
<field ID=1 length=31 type=I>
fieldname1
</field>
<field ID=2>
fieldname2
</field>
<field ID=3>
fieldname3
</field>
</table>
. , . PrepareWriting() , ~.
.
- : CSimpTable.h, CSimpTable.cpp. .
1. XML
, .
(Standardized Generalized Markup Language - SGML), , . (HyperText Markup Language HTML), . , HTML , .. , . , HTML HTML- ( ), .. -.
SGML (eXtensible Markup Language - XML), (W3C World Wide Web Consortium, [. 2]). XML HTML, , .. (schema). , XML[1][1].
XML [. 1]. XML, [. 3], [. 4].
XML-:
<?xml version="1.0"?><message><to>A.B.C.</to><toaddress>[email protected]</toaddress><from>D.E.F.</from><fromaddress>[email protected]</fromaddress><subj>:)</subj><body>:) LOL</body></message>(instance) , .. . , , <message>, <to> .., .