• 新版本读取老版本文件崩溃BUG


    读取文件匹配代码

      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: //dxf
    162             {
    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: //flash
    177             {
    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)//主要组合和正常打开有点区别问题wangxiaobin
    336                 {
    337                     if (g_PageCount >= 1)
    338                     {
    339                         pMedia->HideAndPauseMedia();
    340                     }
    341                 }
    342                 else
    343                 {
    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,    //FLASH
    14     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 //DXF
    40 };
    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,    //FLASH
    15     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 //DXF
    40 };    
    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得到的是枚举类型中的对应的整形数,因此在读取老版本中保存的直线时候,匹配到的对象是新版本中的梯形,会去梯形类中读取,导致读取文件失败。

  • 相关阅读:
    HDU 1873 看病要排队(结构体+优先队列)
    优先队列
    栈和队列
    Light OJ 1214 Large Division (大数取模)
    LightOJ 1078 Integer Divisibility (同余定理)
    51nod 1513-3的幂的和(费马小定理+快速幂)
    51nod 1256 乘法逆元(扩展欧几里得)
    格式测试
    点Point 圆Circle 圆柱Cylinder的继承与派生
    JUC 并发编程--04 常用的辅助类CountDownLatch , CyclicBarrier , Semaphore , 读写锁 , 阻塞队列,CompletableFuture(异步回调)
  • 原文地址:https://www.cnblogs.com/lisuyun/p/3471615.html
Copyright © 2020-2023  润新知