⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 refer.cpp

📁 《C++ Builder 5技术内幕》一书附带的程序源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  int nNum = 0;
//  Get database header information
  try
  {
    nNum += THandleStream::Read( &m_rdReferDatabase.nMagic, 4 );
    nNum += THandleStream::Read( &m_rdReferDatabase.nCount, 4 );
    nNum += THandleStream::Read( &m_rdReferDatabase.nId, 4 );
    nNum += THandleStream::Read( &m_rdReferDatabase.nIndex, 4 );
    nNum += THandleStream::Read( &m_rdReferDatabase.nOffset, 4 );
    for( int i=0; i<4; i++ )
      nNum += THandleStream::Read( &m_rdReferDatabase.nReserved[i], 4 );
  }
  catch( ... )
  {
    Application->MessageBox(
        const_cast< char * >( MI_READHEADFAILED ),
        const_cast< char * >( MT_FATALERROR ),
        MB_OK + MB_ICONERROR );
    Application->Terminate();
  }
// Construct References' link.
  unsigned __int32 nReadCount = m_rdReferDatabase.nCount;
  try
  {
// Allocate memory for m_rdReferDatabase.pReferLink dynamically.
//    m_rdReferDatabase.pReferLink = new TReferLink;
//    m_rdReferDatabase.pReferLink->pReferRecord = NULL;
//    m_rdReferDatabase.pReferLink->pNext = NULL;
// Set working pointer q1 and p1.
    TReferLink   *q1 = new TReferLink;
    TReferRecord *p1 = new TReferRecord;
// Get the first reference record.
    nNum += ReadReferRecord( p1 );
    q1->pReferRecord = p1;
//  Construct the link.
    q1->pPrevious = NULL;
    q1->pNext = NULL;
//  Set the initial reference link field of the reference database.
    m_rdReferDatabase.pReferLink = q1;
//  Set the first reference pointer.
    m_prlFirstReferLink = q1;
//  Set the current reference pointer.
    m_prlCurrReferLink  = q1;
// Get next references.
    while( --nReadCount > 0 )
    {
// Allocate memory for a new one.
      TReferLink *q2 = new TReferLink;
      TReferRecord *p2 = new TReferRecord;
// Get the next reference record.
      nNum += ReadReferRecord( p2 );
      q2->pReferRecord = p2;
//  Construct the link.
      q2->pPrevious = q1;
      q2->pNext = NULL;
      q1->pNext = q2;
// Get next reference.
      q1 = q1->pNext;
    }
//  Set the last reference pointer.
    m_prlLastReferLink  = q1;
  }
  catch( ... )
  {
    Application->MessageBox(
        const_cast< char * >( MI_NOMEMORY ),
        const_cast< char * >( MT_FATALERROR ),
        MB_OK + MB_ICONERROR );
    Application->Terminate();
  }
  return nNum;
}
*/
//---------------------------------------------------------------------------
int __fastcall TReferenceStream::Write( const void *Buffer, int Count )
{
  return THandleStream::Write( Buffer, Count );
}
//---------------------------------------------------------------------------
int __fastcall TReferenceStream::WriteReferDatabaseHeader( TReferDatabaseHeader *prdHeader )
{
  int nNum = 0;
//  Write database header information
  try
  {
    nNum += THandleStream::Write( &prdHeader->nMagic, 4 );
    nNum += THandleStream::Write( &prdHeader->nCount, 4 );
    nNum += THandleStream::Write( &prdHeader->nId, 4 );
    nNum += THandleStream::Write( &prdHeader->nIndex, 4 );
    nNum += THandleStream::Write( &prdHeader->nOffset, 4 );
    for( int i=0; i<4; i++ )
      nNum += THandleStream::Write( &prdHeader->nReserved[i], 4 );
  }
  catch( ... )
  {
    Application->MessageBox(
        const_cast< char * >( MI_WRITEHEADFAILED ),
        const_cast< char * >( MT_FATALERROR ),
        MB_OK + MB_ICONERROR );
    Application->Terminate();
  }
  return nNum;
}
//---------------------------------------------------------------------------
int __fastcall TReferenceStream::WriteReferRecord( TReferRecord *pRef )
{
// virtual int __fastcall Seek(int Offset, Word Origin) = 0;
// Word Type: soFromBeginning, soFromCurrent, soFromEnd.
// Position indicates the current position of the stream pointer.
  THandleStream::Seek( 0, soFromCurrent );  // From the very beginning of the stream.

  int nLen = 0;
  try
  {
    nLen += THandleStream::Write( &pRef->nMagic, 4 );
    nLen += THandleStream::Write( &pRef->nId, 4 );
    nLen += THandleStream::Write( &pRef->eReferType, 1 );
    nLen += THandleStream::Write( &pRef->sReserved, 3 );
    nLen += THandleStream::Write( &pRef->nLength, 4 );
    nLen += THandleStream::Write( &pRef->nOffset, 4 );
    nLen += THandleStream::Write( &pRef->nCrossReferIndex, 1 );
    nLen += THandleStream::Write( &pRef->nAuthors, 1 );
    nLen += THandleStream::Write( &pRef->nTitle, 2 );
    nLen += THandleStream::Write( &pRef->nJournal, 2 );
    nLen += THandleStream::Write( &pRef->vnVolumeAndNumber, 2 );
    nLen += THandleStream::Write( &pRef->nProceedings, 2 );
    nLen += THandleStream::Write( &pRef->nConferencePlace, 2 );
    nLen += THandleStream::Write( &pRef->nConferenceDate, 2 );
    nLen += THandleStream::Write( &pRef->nBook, 2 );
    nLen += THandleStream::Write( &pRef->nEditors, 1 );
    nLen += THandleStream::Write( &pRef->nTechnicalReport, 2 );
    nLen += THandleStream::Write( &pRef->nNote, 2 );
    nLen += THandleStream::Write( &pRef->ymPublicationDate, 4 );
    nLen += THandleStream::Write( &pRef->sePages, 4 );
    nLen += THandleStream::Write( &pRef->nKeywordsNumber, 1 );
    nLen += THandleStream::Write( &pRef->nKeywords, 2 );
    nLen += THandleStream::Write( &pRef->nAbstract, 4 );
    nLen += THandleStream::Write( &pRef->nReserved, 16 );
    if( pRef->nCrossReferIndex > 0 )
      nLen += THandleStream::Write( pRef->asCrossReferIndex.c_str(), ( int )( pRef->nCrossReferIndex ) );
    if( pRef->nAuthors > 0 )
      nLen += THandleStream::Write( pRef->asAuthors.c_str(), ( int )( pRef->nAuthors ) );
    if( pRef->nTitle > 0 )
      nLen += THandleStream::Write( pRef->asTitle.c_str(), ( int )( pRef->nTitle ) );
    if( pRef->nJournal > 0 )
      nLen += THandleStream::Write( pRef->asJournal.c_str(), ( int )( pRef->nJournal ) );
    if( pRef->nProceedings > 0 )
      nLen += THandleStream::Write( pRef->asProceedings.c_str(), ( int )( pRef->nProceedings ) );
    if( pRef->nConferencePlace > 0 )
      nLen += THandleStream::Write( pRef->asConferencePlace.c_str(), ( int )( pRef->nConferencePlace ) );
    if( pRef->nConferenceDate > 0 )
      nLen += THandleStream::Write( pRef->asConferenceDate.c_str(), ( int )( pRef->nConferenceDate ) );
    if( pRef->nKeywords > 0 )
      nLen += THandleStream::Write( pRef->asKeywords.c_str(), ( int )( pRef->nKeywords ) );
    if( pRef->nAbstract > 0 )
      nLen += THandleStream::Write( pRef->asAbstract.c_str(), ( int )( pRef->nAbstract ) );
//  nLen += THandleStream::Write( &m_refRecord.nTail, 4 );
  }
  catch( ... )
  {
    Application->MessageBox(
        const_cast< char * >( MI_WRITEFAILED ),
        const_cast< char * >( MT_FATALERROR ),
        MB_OK + MB_ICONERROR );
    Application->Terminate();
  }
  return nLen;
}
//---------------------------------------------------------------------------
/*
int __fastcall TReferenceStream::WriteAll()
{
  int nNum = 0;
//  Write database header information
  try
  {
    nNum += THandleStream::Write( &m_rdReferDatabase.nMagic, 4 );
    nNum += THandleStream::Write( &m_rdReferDatabase.nCount, 4 );
    nNum += THandleStream::Write( &m_rdReferDatabase.nId, 4 );
    nNum += THandleStream::Write( &m_rdReferDatabase.nIndex, 4 );
    nNum += THandleStream::Write( &m_rdReferDatabase.nOffset, 4 );
    for( int i=0; i<4; i++ )
      nNum += THandleStream::Write( &m_rdReferDatabase.nReserved[i], 4 );
  }
  catch( ... )
  {
    Application->MessageBox(
        const_cast< char * >( MI_WRITEHEADFAILED ),
        const_cast< char * >( MT_FATALERROR ),
        MB_OK + MB_ICONERROR );
    Application->Terminate();
  }
  unsigned __int32 nWriteCount = m_rdReferDatabase.nCount;
  try
  {
// Allocate memory for m_rdReferDatabase.pReferLink dynamically.
// Set working pointer q1 and p1.
    TReferLink   *q1 = m_rdReferDatabase.pReferLink;
    TReferRecord *p1 = m_rdReferDatabase.pReferLink->pReferRecord;
// Write the first reference record.
    if( p1 != NULL )
      nNum += WriteReferRecord( p1 );
// Write next references.
    while( --nWriteCount > 0 ) // || ( q1->pNext != NULL )
    {
      q1 = q1->pNext;
      p1 = q1->pReferRecord;
      if( p1 != NULL )
        nNum += WriteReferRecord( p1 );
    }
  }
  catch( ... )
  {
    Application->MessageBox(
        const_cast< char * >( MI_NOMEMORY ),
        const_cast< char * >( MT_FATALERROR ),
        MB_OK + MB_ICONERROR );
    Application->Terminate();
  }
  return nNum;
}
*/
//---------------------------------------------------------------------------
/*
void __fastcall TReferenceStream::LoadFromFile( const System::AnsiString FileName )
{

}
*/
//---------------------------------------------------------------------------
/*
void __fastcall TReferenceStream::SaveToFile( const System::AnsiString FileName )
{
//  ofstream ofsRefer( m_asFileName, ios::out, filebuf::openprot );

}
*/
//---------------------------------------------------------------------------

//TReferenceStream *pReferenceStream = new TReferenceStream( "RF1993.rrf", fmCreate );
#pragma package(smart_init)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -