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

📄 newsj.cpp

📁 DOS下一个完整的大型程序源代码
💻 CPP
字号:
#include <StdIO.h>
#include <StdLib.h>
#include <Dos.h>
#include <Dir.h>
#include <IO.h>
#include <String.h>
#include "sjcfg.h"

typedef struct
{
   char     version;          // 83H with .dbt, 03H without
   char     year;             // Last Update
   char     month;
   char     day;
   long     recordNum;        //
   unsigned headerLen;        // Header Length, Indicates start of data
   unsigned recordLen;        //
   char     zero1[16];
   short    hasMdx;           // 1 for true
   char     zero2[2];
} DBFHeader;

typedef struct
{
   char     name[11];         // field name: ended by zero
   char     type;             // field type: C, N, L, D, M
   unsigned long offset;      // offset in the buffer
   char     len;              // field length
   char     demLen;           // demo... length
   char     zero[14];         // unused
} DBFField;

enum
{
   tpLoad,
   tpNoLoad,
};

class DBase
{
     //int dbf;
     char *szFilename;
     FILE *dbf;
     char **record;

     int fieldCount, dbfType, changeFlag;
     DBFHeader header;
     DBFField *field;
   public:
     DBase( char *filename, int type = tpLoad );
     ~DBase();
     void Open();
     void Close();
     void SaveData();

     void GetSeekOffset( int nField );
     long GetRecordNum() { return header.recordNum; }
     int GetFieldLen( int nField ) { return field[ nField ].len; }
     void GetField( long lRec, int nField, char *str );
     void AppendRecord( char *rec );
};

// LOG.DBF
enum
{
   fdLogDuty,
   fdLogDate,
   fdLogSjNo,
   fdLogTel,
   fdLogCNo,
   fdLogName,
   fdLogRChg,
   fdLogAChg,
};
const rlLog = 75;
const
   flLogDuty = 6,
   flLogDate = 8,
   flLogSjNo = 6,
   flLogTel  = 8,
   flLogCNo  = 6,
   flLogName = 22,
   flLogRChg = 10, // 9
   flLogAChg = 8;  // 9

// QF.DBF
const rlQf = 24;
enum // Old
{
   fdQfTel = 0,
   fdQfDate,
   fdQfLCTChg,
   fdQfLDTChg,
   fdQfMLTChg,
   fdQfTGTChg,
   fdQfSBTChg,
   fdQfTOMChg,
   fdQfOTChg,
   fdQfRChg,
};
const
   flQfTel  = 8,
   flQfDate = 5,
   flQfRChg = 10; // 9

void main()
{
   setdisk( 2 );

   chdir( "\\" );
   FILE *fp = fopen( "\\SJ\\SJ.CFG", "rb" );
   Config config;
   fread( &config, sizeof( Config ), 1, fp );
   fclose( fp );
   if( config.nDataMonth != 9 )
   {
      puts( "Please install September data first using the old SJ software!" );
      return;
   }

   static char szSJDir[] = "\\SJ";
   puts( "\nNow keeping old SJ:" );
   rename( szSJDir, "\\SJ.OLD" );
   puts( "OK!" );

   mkdir( szSJDir );
   chdir( szSJDir );
   puts( "\nNow copying SJ:" );
   system( "XCOPY C:\\SJ.OLD" );
   puts( "OK!" );
   puts( "\nNow updating SJ:" );
   system( "XCOPY A:\\SJ" );
   puts( "OK!" );

   puts( "\nNow converting LOG.DBF:" );
   DBase *dbfSrcLog = new DBase( "\\SJ.OLD\\LOG.DBF", tpNoLoad );
   DBase *dbfLog = new DBase( "LOG.DBF", tpNoLoad );
   for( long i = 0; i < dbfSrcLog->GetRecordNum(); i ++ )
   {
      if( !( i % 100 ) ) putchar( '.' );
      char szRecord[ rlLog ],
           *p = szRecord;
      *p++ = ' ';

      dbfSrcLog->GetField( i, fdLogDuty, p );
      p += flLogDuty;
      dbfSrcLog->GetField( i, fdLogDate, p );
      p += flLogDate;
      dbfSrcLog->GetField( i, fdLogSjNo, p );
      p += flLogSjNo;
      dbfSrcLog->GetField( i, fdLogTel, p );
      p += flLogTel;
      dbfSrcLog->GetField( i, fdLogCNo, p );
      p += flLogCNo;
      dbfSrcLog->GetField( i, fdLogName, p );
      p += flLogName;
      *p = ' ';
      dbfSrcLog->GetField( i, fdLogRChg, p + 1 );
      p += flLogRChg;
      char str[ 9 ];
      dbfSrcLog->GetField( i, fdLogAChg, str );
      memcpy( p, str, flLogAChg );

      dbfLog->AppendRecord( szRecord );
   }
   delete dbfSrcLog;
   delete dbfLog;
   puts( "\nOK!" );

   puts( "\nNow converting QF.DBF:" );
   DBase *dbfSrcQf = new DBase( "\\SJ.OLD\\QF.DBF", tpNoLoad );
   DBase* dbfQf = new DBase( "QF.DBF", tpNoLoad );
   for( i = 0; i < dbfSrcQf->GetRecordNum(); i ++ )
   {
      if( !( i % 100 ) ) putchar( '.' );
      char szRecord[ rlQf ],
           *p = szRecord;
      *p++ = ' ';

      dbfSrcQf->GetField( i, fdQfTel, p );
      p += flQfTel;
      dbfSrcQf->GetField( i, fdQfDate, p );
      p += flQfDate;
      *p = ' ';
      dbfSrcQf->GetField( i, fdQfRChg, p + 1 );

      dbfQf->AppendRecord( szRecord );
   }
   delete dbfSrcQf;
   delete dbfQf;
   puts( "\nOK!" );

   puts( "\nThe end. OK!!!" );
}

DBase::DBase( char *filename,int type )
{
   szFilename = filename;
   dbfType = type;
   Open();
}

static int maxRecAdd = 100;
void DBase::Open()
{
   changeFlag=0;

   dbf=fopen(szFilename,"rb+");
   if(dbf==NULL)
   {
      char str[50];
      printf( str, "Cann't open: %s", szFilename );
      exit( 0 );
   }

   fread(&header,sizeof(DBFHeader),1,dbf);

   fieldCount=header.headerLen/sizeof(DBFField)-1;
   field=new DBFField[fieldCount];
   fread(field,sizeof(DBFField),fieldCount,dbf);

   if(dbfType==tpNoLoad) return;
   record=new char*[header.recordNum+maxRecAdd];

   int lineLength=header.recordLen;
   fseek(dbf,header.headerLen,SEEK_SET);
   for(long i=0;i<header.recordNum;i++)
   {
      record[i]=new char[lineLength];
      fread(record[i],lineLength,1,dbf);
   }
}

DBase::~DBase()
{
   Close();
}

void DBase::Close()
{
   SaveData();
   fclose(dbf);
   delete field;
   if(dbfType==tpNoLoad) return;
   for(int i=0;i<header.recordNum;i++)  delete record[i];
   delete record;
}

void DBase::SaveData()
{
   if(changeFlag)
   {
      struct date d; getdate(&d);
      header.year =d.da_year-1900;    // Last Update
      header.month=d.da_mon;
      header.day=d.da_day;
      rewind(dbf);
      fwrite(&header,sizeof(DBFHeader),1,dbf);
   }

   if(dbfType==tpLoad && changeFlag)
   {
      fseek(dbf,header.headerLen,SEEK_SET);
      for(int i=0;i<header.recordNum;i++)
        fwrite(record[i],header.recordLen,1,dbf);
      long po=ftell(dbf);
      chsize(fileno(dbf),po);
      fflush(dbf);
   }
   changeFlag=0;
   fclose( dbf );
   dbf=fopen(szFilename,"rb+");
}

int seekOffset,seekSize;

void DBase::GetSeekOffset(int nField)
{
   seekOffset=field[nField].offset;
}

void DBase::AppendRecord(char *szRec)
{
   long offset=header.headerLen+header.recordNum*header.recordLen;
   fseek(dbf,offset,SEEK_SET);
   fwrite(szRec,header.recordLen,1,dbf);
   fflush(dbf);
   header.recordNum++;
   changeFlag=1;
}

void DBase::GetField( long lRec, int nField, char *str )
{
   if( lRec < 0 || lRec >= GetRecordNum() ) return;
   GetSeekOffset( nField );
   if( dbfType == tpLoad )
   {
      char *p = record[ lRec ] + seekOffset;
      memcpy( str, p, GetFieldLen( nField ) );
   }
   else
   {
      long offset = header.headerLen + lRec * header.recordLen + seekOffset;
      fseek( dbf, offset, SEEK_SET );
      fread( str, GetFieldLen( nField ), 1, dbf );
   }
}

⌨️ 快捷键说明

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