博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
新版本读取老版本文件崩溃BUG
阅读量:4595 次
发布时间:2019-06-09

本文共 18000 字,大约阅读时间需要 60 分钟。

读取文件匹配代码

1 BOOL CWBPage::LoadFromFile(CFile *pFile, LONGLONG& lOff, ULONGLONG lFileLength)  2 {  3     if (pFile == NULL)  4     {  5         return FALSE;  6     }  7   8     LONGLONG lPageOff = lOff; //页偏移量  9     //读取页长度 10     ULONGLONG lPageLength; //页内容长度 11  12     pFile->Seek(lPageOff, CFile::begin); 13     pFile->Read((char *)&lPageLength, sizeof(ULONGLONG)); 14     if ((lPageOff + lPageLength) > lFileLength) 15     { 16         return FALSE; 17     } 18     lPageOff += sizeof(ULONGLONG);//偏移量增加 19  20     if (lPageLength <= 1) //如果是空页 21     { 22         lOff = lPageOff; 23         return TRUE; 24     } 25  26     //读取所有对象 27     //int nlayerIndex = 1; //对象图层号 28     while ((ULONGLONG)(lPageOff - lOff) < lPageLength) 29     { 30         //读取对象类型 31         char chObjType; 32         pFile->Seek(lPageOff, CFile::begin); 33         pFile->Read(&chObjType, 1); 34         int nObjType = (int)chObjType; 35  36         switch (nObjType) 37         { 38         case WB_OBJ_LINE: //直线 39             { 40                 CWBLine *pLine = new CWBLine(); 41                 if (NULL == pLine) 42                 { 43                     return FALSE; 44                 } 45                 if (!pLine->LoadFromFile(pFile, lPageOff, lFileLength)) 46                 { 47                     delete pLine; 48                     return FALSE; 49                 } 50                 //pLine->SetLayerIndex(nlayerIndex); //设置对象图层号 51  52                 //m_pWBObjList->AddTail(pLine); 53                 AddWBObject(pLine, pLine->GetLayerType()); 54             } 55             break; 56         case WB_OBJ_CURVE: //曲线 57             { 58                 CWBCurve *pCurve = new CWBCurve(); 59                 if (NULL == pCurve) 60                 { 61                     return FALSE; 62                 } 63                 if (!pCurve->LoadFromFile(pFile, lPageOff, lFileLength)) 64                 { 65                     delete pCurve; 66                     return FALSE; 67                 } 68                 //pCurve->SetLayerIndex(nlayerIndex); //设置对象图层号 69  70                 //m_pWBObjList->AddTail(pCurve); 71                 AddWBObject(pCurve, pCurve->GetLayerType()); 72             } 73             break; 74         case WB_OBJ_ICOCURVE: //图标曲线 75             { 76                 CWBIcoCurve *pIcoCurve = new CWBIcoCurve(); 77                 if (NULL == pIcoCurve) 78                 { 79                     return FALSE; 80                 } 81                 if (!pIcoCurve->LoadFromFile(pFile, lPageOff, lFileLength)) 82                 { 83                     delete pIcoCurve; 84                     return FALSE; 85                 } 86  87                 AddWBObject(pIcoCurve, pIcoCurve->GetLayerType()); 88             } 89             break; 90         case WB_OBJ_POLYGON: //多边形 91             { 92                 CWBPolygon *pPolygon = new CWBPolygon(); 93                 if (NULL ==pPolygon) 94                 { 95                     return FALSE; 96                 } 97                 if (!pPolygon->LoadFromFile(pFile, lPageOff, lFileLength)) 98                 { 99                     delete pPolygon;100                     return FALSE;101                 }102                 //pPolygon->SetLayerIndex(nlayerIndex);103 104                 //m_pWBObjList->AddTail(pPolygon);105                 AddWBObject(pPolygon, pPolygon->GetLayerType());106             }107             break;108         case WB_OBJ_RECT: //矩形109             {110                 CWBRectangle *pRect = new CWBRectangle();111                 if (NULL == pRect)112                 {113                     return FALSE;114                 }115                 if (!pRect->LoadFromFile(pFile, lPageOff, lFileLength))116                 {117                     delete pRect;118                     return FALSE;119                 }120                 //pRect->SetLayerIndex(nlayerIndex);121                 //m_pWBObjList->AddTail(pRect);122                 AddWBObject(pRect, pRect->GetLayerType());123             }124             break;125         case WB_OBJ_TEXT: //文本126             {127                 CWBText *pText = new CWBText();128                 if (NULL == pText)129                 {130                     return FALSE;131                 }132                 if(!pText->LoadFromFile(pFile, lPageOff, lFileLength))133                 {134                     delete pText;135                     return FALSE;136                 }137                 //pText->SetLayerIndex(nlayerIndex);138 139                 //m_pWBObjList->AddTail(pText);140                 AddWBObject(pText, pText->GetLayerType());141             }142             break;143         case WB_OBJ_PICTURE: //图片144             {145                 CWBPicture *pPicture = new CWBPicture();146                 if (NULL == pPicture)147                 {148                     return FALSE;149                 }150                 if (!pPicture->LoadFromFile(pFile, lPageOff, lFileLength))151                 {152                     delete pPicture;153                     return FALSE;154                 }155                 //pPicture->SetLayerIndex(nlayerIndex);156 157                 //m_pWBObjList->AddTail(pPicture);158                 AddWBObject(pPicture, pPicture->GetLayerType());159             }160             break;161         case WB_OBJ_DXF: //dxf162             {163                 CWBDxf *pDxf = new CWBDxf();164                 if (NULL == pDxf)165                 {166                     return FALSE;167                 }168                 if (!pDxf->LoadFromFile(pFile, lPageOff, lFileLength))169                 {170                     delete pDxf;171                     return FALSE;172                 }173                 AddWBObject(pDxf, pDxf->GetLayerType());174             }175             break;176         case WB_OBJ_FLASH: //flash177             {178                 CWBFlash *pFlash = new CWBFlash();179                 if (NULL == pFlash)180                 {181                     return FALSE;182                 }183                 if (!pFlash->LoadFromFile(pFile, lPageOff, lFileLength))184                 {185                     delete pFlash;186                     return FALSE;187                 }188                 //pFlash->SetLayerIndex(nlayerIndex);189 190                 //m_pWBObjList->AddTail(pFlash);191                 AddWBObject(pFlash, pFlash->GetLayerType());192             }193             break;194 195         case WB_OBJ_ELLIPSE: //椭圆196             {197                 CWBEllipse *pEllipse = new CWBEllipse();198                 if (NULL == pEllipse)199                 {200                     return FALSE;201                 }202                 if(!pEllipse->LoadFromFile(pFile, lPageOff, lFileLength))203                 {204                     delete pEllipse;205                     return FALSE;206                 }207                 //pEllipse->SetLayerIndex(nlayerIndex);208                 //m_pWBObjList->AddTail(pEllipse);209                 AddWBObject(pEllipse, pEllipse->GetLayerType());210             }211             break;212         case WB_OBJ_TRIANGLE:    //三角形213             {214                 CWBTriangle *pTriangle = new CWBTriangle();215                 if ( NULL == pTriangle)216                 {217                     return FALSE;218                 }219                 if (!pTriangle->LoadFromFile(pFile, lPageOff, lFileLength))220                 {221                     delete pTriangle;222                     return FALSE;223                 }224                 //pTriangle->SetLayerIndex(nlayerIndex);225 226                 //m_pWBObjList->AddTail(pTriangle);227                 AddWBObject(pTriangle, pTriangle->GetLayerType());228             }229             break;230         case WB_OBJ_RHOMBUS: //菱形231             {232                 CWBRhombus *pRhombus = new CWBRhombus();233                 if (NULL == pRhombus)234                 {235                     return FALSE;236                 }237                 if (!pRhombus->LoadFromFile(pFile, lPageOff, lFileLength))238                 {239                     delete pRhombus;240                     return FALSE;241                 }242                 //pRhombus->SetLayerIndex(nlayerIndex);243 244                 //m_pWBObjList->AddTail(pRhombus);245                 AddWBObject(pRhombus, pRhombus->GetLayerType());246             }247             break;248         case WB_OBJ_PENTAGON: //五边形249             {250                 CWBPentagon *pPentagon = new CWBPentagon();251                 if (NULL == pPentagon)252                 {253                     return FALSE;254                 }255                 if (!pPentagon->LoadFromFile(pFile, lPageOff, lFileLength))256                 {257                     delete pPentagon;258                     return FALSE;259                 }260                 //pPentagon->SetLayerIndex(nlayerIndex);261 262                 //m_pWBObjList->AddTail(pPentagon);263                 AddWBObject(pPentagon, pPentagon->GetLayerType());264             }265             break;266         case WB_OBJ_HEXAGON: //六边形267             {268                 CWBHexagon *pHexagon = new CWBHexagon();269                 if (NULL == pHexagon)270                 {271                     return FALSE;272                 }273                 if (!pHexagon->LoadFromFile(pFile, lPageOff, lFileLength))274                 {275                     delete pHexagon;276                     return FALSE;277                 }278                 //pHexagon->SetLayerIndex(nlayerIndex);279 280                 //m_pWBObjList->AddTail(pHexagon);281                 AddWBObject(pHexagon, pHexagon->GetLayerType());282             }283             break;284         case WB_OBJ_FIVEPOINTSTART: //五角星285             {286                 CWBFivepointstart *pFivepointstart = new CWBFivepointstart();287                 if (NULL == pFivepointstart)288                 {289                     return FALSE;290                 }291                 if (!pFivepointstart->LoadFromFile(pFile, lPageOff, lFileLength))292                 {293                     delete pFivepointstart;294                     return FALSE;295                 }296                 //pFivepointstart->SetLayerIndex(nlayerIndex);297 298                 //m_pWBObjList->AddTail(pFivepointstart);299                 AddWBObject(pFivepointstart, pFivepointstart->GetLayerType());300             }301             break;302         case WB_OBJ_TRAPEZIUM: //梯形303             {304                 CWBTrapezium *pTrapezium = new CWBTrapezium();305                 if (NULL == pTrapezium)306                 {307                     return FALSE;308                 }309                 if (!pTrapezium->LoadFromFile(pFile, lPageOff, lFileLength))310                 {311                     delete pTrapezium;312                     return FALSE;313                 }314                 //pTrapezium->SetLayerIndex(nlayerIndex);315 316                 //m_pWBObjList->AddTail(pTrapezium);317                 AddWBObject(pTrapezium, pTrapezium->GetLayerType());318             }319             break;320         case WB_OBJ_MEDIA:321             {322                 //加载新视频323                 CWBMedia* pMedia = new CWBMedia(NULL);324                 if (NULL == pMedia)325                 {326                     return FALSE;327                 }328                 if (!pMedia->LoadFromFile(pFile, lPageOff, lFileLength))329                 {330                     delete pMedia;331                     pMedia = NULL;332                     return FALSE;333                 }334                 //将新视频的显示状态全部设置为隐藏,否则会在第一页显示出所有的视频335                 if (g_pWhiteBoardView->m_bIsCombin)//主要组合和正常打开有点区别问题wangxiaobin336                 {337                     if (g_PageCount >= 1)338                     {339                         pMedia->HideAndPauseMedia();340                     }341                 }342                 else343                 {344                     if (g_PageCount > 1)345                     {346                         pMedia->HideAndPauseMedia();347                     }348                 }349                 350 351                 AddWBObject(pMedia, pMedia->GetLayerType());352             }353             break;354         case WB_OBJ_DOCUMENT:355             {356                 CWBDocument *pDoc = new CWBDocument();357                 if (NULL == pDoc)358                 {359                     return FALSE;360                 }361                 pDoc->SetPageIndex(g_PageCount);362                 if (!pDoc->LoadFromFile(pFile, lPageOff, lFileLength))363                 {364                     delete pDoc;365                     return FALSE;366                 }367                 //pDoc->SetLayerIndex(nlayerIndex);368 369                 //m_pWBObjList->AddTail(pDoc);370                 AddWBObject(pDoc, pDoc->GetLayerType());371             }372             break;373         case WB_OBJ_COMBINE:374             {375                 CWBCombine *pCombine = new CWBCombine();376                 if (NULL == pCombine)377                 {378                     return FALSE;379                 }380                 if (!pCombine->LoadFromFile(pFile, lPageOff, lFileLength))381                 {382                     delete pCombine;383                     return FALSE;384                 }385                 //pCombine->SetLayerIndex(nlayerIndex);386 387                 //m_pWBObjList->AddTail(pCombine);388                 m_nWBMaxLayerId = pCombine->GetPageLayerIndex();389                 AddWBObject(pCombine, pCombine->GetLayerType());390             }391             break;392         case WB_OBJ_ANNOTATIONS:393             {394                 CWBAnnotations *pAnnotations = new CWBAnnotations();395                 if (NULL == pAnnotations)396                 {397                     return FALSE;398                 }399                 if (!pAnnotations->LoadFromFile(pFile, lPageOff, lFileLength))400                 {401                     delete pAnnotations;402                     return FALSE;403                 }404                 //pAnnotations->SetLayerIndex(nlayerIndex);405 406                 //m_pWBObjList->AddTail(pAnnotations);407                 AddWBObject(pAnnotations, pAnnotations->GetLayerType());408             }409             break;410         case WB_OBJ_BAFFLE:411             {412                 CWBBafflePlate *pBafflePlate = new CWBBafflePlate();413                 if (NULL == pBafflePlate)414                 {415                     return FALSE;416                 }417                 if (!pBafflePlate->LoadFromFile(pFile, lPageOff, lFileLength))418                 {419                     delete pBafflePlate;420                     return FALSE;421                 }422                 //pBafflePlate->SetLayerIndex(nlayerIndex);423 424                 //m_pWBObjList->AddTail(pBafflePlate);425                 AddWBObject(pBafflePlate, pBafflePlate->GetLayerType());426             }427             break;428         default:429             return FALSE;430         }431     }432 433     //m_dwCurObjLayerIndex = nlayerIndex - 1; //设置当前图层号434     lOff = lPageOff;435     return TRUE;436 }
View Code

老版本对象枚举类型代码

1 enum WB_OBJ_TYPE 2 { 3     WB_OBJ_NORMAL = 0, 4     WB_OBJ_LINE, //直线 5     WB_OBJ_CURVE, //曲线 6     WB_OBJ_ICOCURVE,//图标曲线 7     WB_OBJ_POLYGON, //多边形  8     WB_OBJ_RECT,    //矩形 9     WB_OBJ_SELECTRECT, //选择框10     WB_OBJ_PICTURE,  //图片11     WB_OBJ_MOVIE,    //视频12     WB_OBJ_MEDIA,   //新视频13     WB_OBJ_FLASH,    //FLASH14     WB_OBJ_DOCUMENT, //文档15     WB_OBJ_TEXT,        //文字16     WB_OBJ_ELLIPSE,    //椭圆17     WB_OBJ_TRIANGLE, //三角形18     WB_OBJ_RHOMBUS,    //菱形19     WB_OBJ_BAFFLE,  //挡板20     WB_OBJ_COMBINE, //组合21     WB_OBJ_MAQN,     //放大镜22     WB_OBJ_SPOTLIGHT, //聚光灯23     WB_OBJ_ANNOTATIONS,  //标注24     WB_OBJ_CAMERA,   //摄像头25     WB_OBJ_DUSTBIN,    //垃圾箱26     WB_OBJ_RULER,//直尺27     WB_OBJ_PROTRACTOR,//量角器28     WB_OBJ_ANGLE,    //生成刻度29     WB_OBJ_SETSQUARE,//三角板30     WB_OBJ_COMPASS,    //圆规31     WB_OBJ_ARC,        //圆弧32     WB_OBJ_SECTOR,     //扇形33     WB_OBJ_ARBITRARYTRIANGLE, //任意三角形34     WB_OBJ_PALLELOGAM,      //平行四边形35     WB_OBJ_PENTAGON,      //五边形36     WB_OBJ_HEXAGON,      //六边形37     WB_OBJ_FIVEPOINTSTART, //五角星38     WB_OBJ_TRAPEZIUM,     //梯形39     WB_OBJ_DXF //DXF40 };
View Code

新版本对象枚举类型代码

1 enum WB_OBJ_TYPE 2 { 3     WB_OBJ_NORMAL = 0, 4         WB_OBJ_TRAPEZIUM,     //梯形 5     WB_OBJ_LINE, //直线 6     WB_OBJ_CURVE, //曲线 7     WB_OBJ_ICOCURVE,//图标曲线 8     WB_OBJ_POLYGON, //多边形  9     WB_OBJ_RECT,    //矩形10     WB_OBJ_SELECTRECT, //选择框11     WB_OBJ_PICTURE,  //图片12     WB_OBJ_MOVIE,    //视频13     WB_OBJ_MEDIA,   //新视频14     WB_OBJ_FLASH,    //FLASH15     WB_OBJ_DOCUMENT, //文档16     WB_OBJ_TEXT,        //文字17     WB_OBJ_ELLIPSE,    //椭圆18     WB_OBJ_TRIANGLE, //三角形19     WB_OBJ_RHOMBUS,    //菱形20     WB_OBJ_BAFFLE,  //挡板21     WB_OBJ_COMBINE, //组合22     WB_OBJ_MAQN,     //放大镜23     WB_OBJ_SPOTLIGHT, //聚光灯24     WB_OBJ_ANNOTATIONS,  //标注25     WB_OBJ_CAMERA,   //摄像头26     WB_OBJ_DUSTBIN,    //垃圾箱27     WB_OBJ_RULER,//直尺28     WB_OBJ_PROTRACTOR,//量角器29     WB_OBJ_ANGLE,    //生成刻度30     WB_OBJ_SETSQUARE,//三角板31     WB_OBJ_COMPASS,    //圆规32     WB_OBJ_ARC,        //圆弧33     WB_OBJ_SECTOR,     //扇形34     WB_OBJ_ARBITRARYTRIANGLE, //任意三角形35     WB_OBJ_PALLELOGAM,      //平行四边形36     WB_OBJ_PENTAGON,      //五边形37     WB_OBJ_HEXAGON,      //六边形38     WB_OBJ_FIVEPOINTSTART, //五角星39     WB_OBJ_DXF //DXF40 };
View Code

在新版本中由于有人把WB_OBJ_TRAPEZIUM,     //梯形

放在了第二行,原来第二行是WB_OBJ_LINE, //直线

保存老版本的时候1代表的是WB_OBJ_LINE, //直线

新版本中1代表的是WB_OBJ_TRAPEZIUM,  //梯形

char chObjType;

pFile->Seek(lPageOff, CFile::begin);
pFile->Read(&chObjType, 1);
int nObjType = (int)chObjType;

由于Read()中nOjbType得到的是枚举类型中的对应的整形数,因此在读取老版本中保存的直线时候,匹配到的对象是新版本中的梯形,会去梯形类中读取,导致读取文件失败。

转载于:https://www.cnblogs.com/lisuyun/p/3471615.html

你可能感兴趣的文章
单一职责原则
查看>>
virtualbox 安装 USB 扩展功能
查看>>
clang: error: linker command failed with exit code 1 (use -v to see invocation) 无法定位的问题...
查看>>
HDU 4003 Find Metal Mineral(分组背包+树形DP)
查看>>
数据导出和TreeView
查看>>
UI图标不用愁:矢量字体图标Font-Awesome
查看>>
android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()详解二之小秘与领导的故事...
查看>>
指针数组和数组指针的区别
查看>>
KNN和SVM的区别和联系
查看>>
JAVA的Random类 Java中的Random()函数
查看>>
判断手机横屏和竖屏方向
查看>>
动态闪字
查看>>
docker入门1---docker的简介和安装
查看>>
MyEclipse2017修改Web Context Root
查看>>
svn的使用总结
查看>>
ERP光有主生产计划不够 还得详细生产排程
查看>>
HTML5 2D平台游戏开发#2跳跃与二段跳
查看>>
【bzoj3238】【Ahoi2013】差异
查看>>
Spring源码:Spring IoC容器加载过程(1)
查看>>
Hive row_number() 等用法
查看>>