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

📄 refer.cpp

📁 《C++ Builder 5技术内幕》一书附带的程序源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Refer.h"
//---------------------------------------------------------------------------
__fastcall TReferenceStream::TReferenceStream( const System::AnsiString FileName, Word Mode )
  : TFileStream( FileName, Mode )
{
  m_asFileName = FileName;
  m_bModified = false;
//  if( FileExists( FileName ) )
//  {
// Seek to the very beginning of the stream.
//    Seek( 0, soFromBeginning );
//    ReadAll();
//  }
//  else
//  {
//    m_pCurrReferRec = NULL;
//    m_rdReferDatabase.nMagic  = MAGIC_DATABASE;
//    m_rdReferDatabase.nCount  = ( unsigned __int32 )0;
//    m_rdReferDatabase.nId     = ( unsigned __int32 )0;
//    m_rdReferDatabase.nIndex  = ( unsigned __int32 )0;
//    m_rdReferDatabase.nOffset = ( unsigned __int32 )36;
//    for( int i=0; i<4; i++ )
//      m_rdReferDatabase.nReserved[i] = ( unsigned __int32 )0;
//    m_rdReferDatabase.pReferLink = NULL;
//    m_prlCurrReferLink  = NULL;
//    m_prlFirstReferLink = NULL;
//    m_prlLastReferLink  = NULL;
//  }
}
//---------------------------------------------------------------------------
int __fastcall TReferenceStream::Seek( int Offset, Word Origin )
{
  return THandleStream::Seek( Offset, Origin );
}
//---------------------------------------------------------------------------
int __fastcall TReferenceStream::Read( void *Buffer, int Count )
{
  return THandleStream::Read( Buffer, Count );
}
//---------------------------------------------------------------------------
int __fastcall TReferenceStream::ReadReferDatabaseHeader( TReferDatabaseHeader *prdHeader )
{
  int nNum = 0;
//  Get database header information
  try
  {
    nNum += THandleStream::Read( &prdHeader->nMagic, 4 );
    nNum += THandleStream::Read( &prdHeader->nCount, 4 );
    nNum += THandleStream::Read( &prdHeader->nId, 4 );
    nNum += THandleStream::Read( &prdHeader->nIndex, 4 );
    nNum += THandleStream::Read( &prdHeader->nOffset, 4 );
    for( int i=0; i<4; i++ )
      nNum += THandleStream::Read( &prdHeader->nReserved[i], 4 );
  }
  catch( ... )
  {
    Application->MessageBox(
        const_cast< char * >( MI_READHEADFAILED ),
        const_cast< char * >( MT_FATALERROR ),
        MB_OK + MB_ICONERROR );
    Application->Terminate();
  }
  return nNum;
}
//---------------------------------------------------------------------------
int __fastcall TReferenceStream::ReadReferRecord( 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 current position of the stream.

//  return THandleStream::Read( pRef, 186 );
  int nLen = 0;
  try
  {
    nLen += THandleStream::Read( &pRef->nMagic, 4 );
    nLen += THandleStream::Read( &pRef->nId, 4 );
    nLen += THandleStream::Read( &pRef->eReferType, 1 );
    nLen += THandleStream::Read( &pRef->sReserved, 3 );
    nLen += THandleStream::Read( &pRef->nLength, 4 );
    nLen += THandleStream::Read( &pRef->nOffset, 4 );
    nLen += THandleStream::Read( &pRef->nCrossReferIndex, 1 );
    nLen += THandleStream::Read( &pRef->nAuthors, 1 );
    nLen += THandleStream::Read( &pRef->nTitle, 2 );
    nLen += THandleStream::Read( &pRef->nJournal, 2 );
    nLen += THandleStream::Read( &pRef->vnVolumeAndNumber, 2 );
    nLen += THandleStream::Read( &pRef->nProceedings, 2 );
    nLen += THandleStream::Read( &pRef->nConferencePlace, 2 );
    nLen += THandleStream::Read( &pRef->nConferenceDate, 2 );
    nLen += THandleStream::Read( &pRef->nBook, 2 );
    nLen += THandleStream::Read( &pRef->nEditors, 1 );
    nLen += THandleStream::Read( &pRef->nTechnicalReport, 2 );
    nLen += THandleStream::Read( &pRef->nNote, 2 );
    nLen += THandleStream::Read( &pRef->ymPublicationDate, 4 );
    nLen += THandleStream::Read( &pRef->sePages, 4 );
    nLen += THandleStream::Read( &pRef->nKeywordsNumber, 1 );
    nLen += THandleStream::Read( &pRef->nKeywords, 2 );
    nLen += THandleStream::Read( &pRef->nAbstract, 4 );
    nLen += THandleStream::Read( &pRef->nReserved, 16 );

// Read pRef->CrossReferIndex if exists.
// If no type-conversion, (int), the result is correct too.
// But C++Builder, like any C++ Compiler, never do strict type-checking,
// so we recommend use explicit type conversion.
// AnsiString class, pRef->asCrossReferIndex, can not be initialized by such:
// nLen += THandleStream::Read( &pRef->asCrossReferIndex, ( int )pRef->nCrossReferIndex );
// And can not be used as &<AnsiString>.
//
// Sometimes, a string, typed as <char *>, is terminated by "\0".
// while Reading from a disk file, application does NOT read the terminating chararcter!
// So we must use member function, SubString(int, int), to truncate the string.
// If we don't, for example, let the pAuthors string are
// "Rau R B, and Fisher J A" + "\0",
// while the pTitle string are
// "The VLIW architecture" + "\0".
// The last terminating character, "\0", is not generated
// by the member function, THandleStream::Read( void *, int ), that is,
// Once we release the space of pAuthors, the memory map is
// "The VLIW architecture A" + "\0".
// That will be the result read.
    if( pRef->nCrossReferIndex > 0 )
    {
      char *pIndex = new char;
      nLen += THandleStream::Read( pIndex, ( int )pRef->nCrossReferIndex );
      pRef->asCrossReferIndex = AnsiString( pIndex ).SubString( 0, ( int )pRef->nCrossReferIndex );
      if( pIndex != NULL )  {  delete pIndex;  pIndex = NULL;  }
    }

    if( pRef->nAuthors > 0 )
    {
      char *pAuthors = new char;
      nLen += THandleStream::Read( pAuthors, ( int )pRef->nAuthors );
      pRef->asAuthors = AnsiString( pAuthors ).SubString( 0, ( int )pRef->nAuthors );
      if( pAuthors != NULL )  {  delete pAuthors;  pAuthors = NULL;  }
    }

    if( pRef->nTitle > 0 )
    {
      char *pTitle = new char;
      nLen += THandleStream::Read( pTitle, ( int )pRef->nTitle );
      pRef->asTitle = AnsiString( pTitle ).SubString( 0, ( int )pRef->nTitle );
      if( pTitle != NULL )  {  delete pTitle;  pTitle = NULL;  }
    }

    if( pRef->nJournal > 0 )
    {
      char *pJournal = new char;
      nLen += THandleStream::Read( pJournal, ( int )pRef->nJournal );
      pRef->asJournal = AnsiString( pJournal ).SubString( 0, ( int )pRef->nJournal );
      if( pJournal != NULL )  {  delete pJournal;  pJournal = NULL;  }
    }

    if( pRef->nProceedings > 0 )
    {
      char *pProceedings = new char;
      nLen += THandleStream::Read( pProceedings, ( int )pRef->nProceedings );
      pRef->asProceedings = AnsiString( pProceedings ).SubString( 0, ( int )pRef->nProceedings );
      if( pProceedings != NULL )  {  delete pProceedings;  pProceedings = NULL;  }
    }

    if( pRef->nConferencePlace > 0 )
    {
      char *pConferencePlace = new char;
      nLen += THandleStream::Read( pConferencePlace, ( int )pRef->nConferencePlace );
      pRef->asConferencePlace = AnsiString( pConferencePlace ).SubString( 0, ( int )pRef->nConferencePlace );
      if( pConferencePlace != NULL )  {  delete pConferencePlace;  pConferencePlace = NULL;  }
    }

    if( pRef->nConferenceDate > 0 )
    {
      char *pConferenceDate = new char;
      nLen += THandleStream::Read( pConferenceDate, ( int )pRef->nConferenceDate );
      pRef->asConferenceDate = AnsiString( pConferenceDate ).SubString( 0, ( int )pRef->nConferenceDate );
      if( pConferenceDate != NULL )  {  delete pConferenceDate;  pConferenceDate = NULL;  }
    }

    if( pRef->nBook > 0 )
    {
      char *pBook = new char;
      nLen += THandleStream::Read( pBook, ( int )pRef->nBook );
      pRef->asBook = AnsiString( pBook ).SubString( 0, ( int )pRef->nBook );
      if( pBook != NULL )  {  delete pBook;  pBook = NULL;  }
    }

    if( pRef->nEditors > 0 )
    {
      char *pEditors = new char;
      nLen += THandleStream::Read( pEditors, ( int )pRef->nEditors );
      pRef->asEditors = AnsiString( pEditors ).SubString( 0, ( int )pRef->nEditors );
      if( pEditors != NULL )  {  delete pEditors;  pEditors = NULL;  }
    }

    if( pRef->nTechnicalReport > 0 )
    {
      char *pTechnicalReport = new char;
      nLen += THandleStream::Read( pTechnicalReport, ( int )pRef->nTechnicalReport );
      pRef->asTechnicalReport = AnsiString( pTechnicalReport ).SubString( 0, ( int )pRef->nTechnicalReport );
      if( pTechnicalReport != NULL )  {  delete pTechnicalReport;  pTechnicalReport = NULL;  }
    }

    if( pRef->nNote > 0 )
    {
      char *pNote = new char;
      nLen += THandleStream::Read( pNote, ( int )pRef->nNote );
      pRef->asNote = AnsiString( pNote ).SubString( 0, ( int )pRef->nNote );
      if( pNote != NULL )  {  delete pNote;  pNote = NULL;  }
    }

    if( pRef->nKeywords > 0 )
    {
      char *pKeywords = new char;
      nLen += THandleStream::Read( pKeywords, ( int )pRef->nKeywords );
      pRef->asKeywords = AnsiString( pKeywords ).SubString( 0, ( int )pRef->nKeywords );
      if( pKeywords != NULL )  {  delete pKeywords;  pKeywords = NULL;  }
    }

    if( pRef->nAbstract > 0 )
    {
      char *pAbstract = new char;
      nLen += THandleStream::Read( pAbstract, ( int )pRef->nAbstract );
      pRef->asAbstract = AnsiString( pAbstract ).SubString( 0, ( int )pRef->nAbstract );
      if( pAbstract != NULL )  {  delete pAbstract;  pAbstract = NULL;  }
    }
  }
  catch( ... )
  {
    Application->MessageBox(
        const_cast< char * >( MI_READFAILED ),
        const_cast< char * >( MT_FATALERROR ),
        MB_OK + MB_ICONERROR );
    Application->Terminate();
  }
  return nLen;
}
//---------------------------------------------------------------------------
/*
int __fastcall TReferenceStream::ReadAll()
{

⌨️ 快捷键说明

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