有一次在招聘C++程序员时,出的一道考题,内容其实就是MS SQL Server数据库数据文件页面头部结构,如下:

有个file.a文件,这个文件以16sec[sec是扇区,每个sec包含512个Byte(字节)]为一个页进行分组并编号。
如:
文件的0-15sec(0-8191byte) 为第0页
文件的16-31sec(8192-16383byte) 为第1页
文件的32-47sec(16384-24575byte) 为第2页 以此类推

每个页的头96个字节结构如下:(注意:这里是每个页头部96Byte,1页大小是16 sec,8192 bytes)
struct mdfPageHeader //文件页头部结构
    {
      UINT8    m_headerVersion; //版本
      UINT8    m_type;         //页类型
      UINT8    m_typeFlagBits;
      UINT8    m_level;  
      UINT8    m_flagBits;   
      UINT8    m_reservedB;    
      UINT16   m_indexId;    
      UINT32   m_prevPage_id;  
      UINT16   m_prevPage_fid;
      UINT16   pminlen;     
      UINT32   m_nextPage_id;  
      UINT16   m_nextPage_fid;
      UINT16   m_slotCnt;    
      UINT32   m_objId;     //所属对象ID    
      UINT16   m_freeCnt;    
      UINT16   m_freeData;   
      UINT32   m_pageId_id;  //每页编号 
      UINT16   m_pageId_fid;   
      UINT16   m_reservedCnt;  
      UINT32   m_lsn_d1;    
      UINT32   m_lsn_d2;
      UINT16   m_lsn_w1;
      UINT16   m_xactReserved; 
      UINT32   m_xdesId_id;
      UINT16   m_xdesId_fid;
      UINT16   m_ghostRecCnt;
      UINT32   m_tornBits;   
      UINT64   temp1;
      UINT64   temp2;
      UINT64   temp3;
      UINT64   temp4;
    };

用VC++完成下面编程:
把符合m_headerVersion==1、m_type==1、m_objId==1三个条件的页面(16sec)找出来,
并把这些页面按照查询先后顺序写到另一个文件file.b文件中。

提示:
打开和创建文件可以用下面两种方法来实现
1、CFile fileo,filew;
fileo.Open("file.a",CFile::modeRead|CFile::typeBinary);
filew.Open("file.b",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);

2、HANDLE hFileA,hfileB;
hFileA = CreateFile(_T("file.a"),GENERIC_READ, FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
hFileB = CreateFile(_T("file.b"),GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);