📄 newsj.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 + -