谢谢你给的回答啊,我还有一个问题想请教一下

我自己写了一个画图的小程序,然后现在老师要求不用MFC的串行化方式存储和读取文件,让我自己用fwrite和fread写一套存储机制,我是在一个文档窗口里面用一个指针链表(CTypedList类)来存储的当前窗口里面的图形元素,每个元素有一些特定的信息,都是派生于一个Element类,照这样的话,应该怎样设计这个储存的方式呢?(不保存为位图,因为我的每一个图形元素还可以移动和删除,所以要求打开以后保持原状)...求高手帮帮忙吧......

这个有点难度,我写了一个,可以参考:
enum SHAPE_CODE
{
RECTANGLE,
CIRCLE,
};

class Element
{
public:
virtual int getShape() = 0;
virtual void read( FILE* fp ) = 0;
virtual void write( FILE* fp ) = 0;
};

class CRectangle : public Element
{
public:
virtual int getShape() { return RECTANGLE; };

virtual void read( FILE* fp )
{
fread( &p1, sizeof( p1 ), 1, fp );
fread( &p2, sizeof( p2 ), 1, fp );
}

virtual void write( FILE* fp )
{
fwrite( &p1, sizeof( p1 ), 1, fp );
fwrite( &p2, sizeof( p2 ), 1, fp );
}

private:
POINT p1;
POINT p2;
};

class CCircle : public Element
{
public:
virtual int getShape() { return CIRCLE; };

virtual void read( FILE* fp )
{
fread( ¢er, sizeof( center ), 1, fp );
fread( &r, sizeof( r ), 1, fp );
}

virtual void write( FILE* fp )
{
fwrite( ¢er, sizeof( center ), 1, fp );
fwrite( &r, sizeof( r ), 1, fp );
}

private:
POINT center;
int r ;
};

void readIt()
{
FILE *fp = fopen( "test", "rb" );
int count;
fread( &count, sizeof( count ), 1, fp );
Element **elm = new Element *[ count ];
for ( int i = 0; i < count; ++i )
{
int shape;
fread( &shape, sizeof( shape ), 1, fp );
switch ( shape )
{
case RECTANGLE:
elm[ i ] = new CRectangle;
break;
case CIRCLE:
elm[ i ] = new CCircle;
break;
}
elm[ i ]->read( fp );
}

fclose( fp );
}

int main()
{
CCircle c;
CRectangle r;

Element *elm[] = { &c, &r };

FILE *fp = fopen( "test", "wb" );
int count = _countof( elm );
fwrite( &count, sizeof( count ), 1, fp );
for ( int i = 0; i < count; ++i )
{
int shape = elm[ i ]->getShape();
fwrite( &shape, sizeof( shape ), 1, fp );
elm[ i ]->write( fp );
}

fclose( fp );

readIt();
}来自:求助得到的回答
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答
大家正在搜