?? opendbf.cpp
字號(hào):
#include "opendbf.h "
#include "stdio.h"
#include "string.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED.CODE THIS.FILE[]=_FILE;
#endif
BOOL COperDbf::Open(const char*ppszFileName)
{
if(!Rdbf.OPen(ppszFileName,CFile::modeReadWrite|CFile::typeBinary))
RDbf.Abort(); //打開數(shù)據(jù)庫(kù)文件,沒有則關(guān)閉
RDbf.Read((char*)&stru1,32); //分別將結(jié)構(gòu)及字段說明讀入結(jié)構(gòu)體
zd_num=(int)(struc1.specification_long-32-1)/32; //計(jì)算字段個(gè)數(shù)
for (int i=0;i<zd_num;i++)
RDbf.Read((char*)&stru2[i],32);
size_c_x+=stru1.specification_long; //結(jié)構(gòu)說明部分的字節(jié)數(shù)+1
return TRUE;
}
void COper Dbf::Read(const char *msg_c,char *buf,int zd)
{
find_x=-1; //先將所要查找的字段設(shè)為-1
size_c_x=stru1.sepicfication_long+1;
size_c=1;
for(int i=0;i<zd_num; i++)
{
if(strstr(stru2[i].zd_name,msg_c))
{
find_x=i; //打到相應(yīng)的字段名,則將該字段號(hào)賦與find_x
break;
}
}
if(find_x==-1) //數(shù)據(jù)庫(kù)中沒有所要尋找的字段名時(shí)
{
AfxMessageBox("數(shù)據(jù)庫(kù)沒有相應(yīng)的字段名!",MB_OK|MB_ICONINFORMATION);
RDbf.Abort();
return;
}
if(zd==0) //如果是第一個(gè)字段
size_c=size_c_x; //第一條記錄中第一個(gè)字段的位置
else
{
size_c=size_c_x;
size_c+=(unsigned)ze*stru1.cecord_long; //第(zd-1)條記錄起始位置
}
for(i=0;i<find_x;i++)
size_c+=stru2[i].zd_long; //現(xiàn)已處于所要讀的字段起始位置
RDbf.Seek(size_c,CFile::begin);
RDbf.Read(buf,stru2[finc_x].zd_long);
}
void COperDbf::Write(int func,struct dbf_type *stru,int num, long no)
{
unsigned size, ff;
char *buf;
union stn
{
unsigned long n;
char sn[1];
}s;
switch(func)
{
case 0: //插入,將插入項(xiàng)后的所有記錄讀入內(nèi)存
if(no==-1) //如果要插入文件尾
no=stru1.record_num+1; //記錄數(shù)加1
ff=stru1.record_long*(unsigned)(stru1.record_num-no+1)+1;
buf=new char[ff];
size=stru1.specification_long+stru1.record_long*(unsigned)(no-1);
RDbf.Seek(size,CFile::begin);
RDbf.Read(buf,ff);標(biāo)志
for(int i=0;i<num;i++) //將所插入內(nèi)容寫入數(shù)據(jù)庫(kù)
{
RDbf.Seek(size,CFile::begin);
RDbf.Write(",",); //越過一個(gè)刪除
RDbf.Write(stur[i],stru1.record_long-1);
size+=stru1.record_long-1;
}
RDbf.Write(buf,ff);
RDbf.Seek(4,CFile::begin); //修改記錄數(shù)
s.n=stru1.record_num++;
RDbf.Write(s.sn,1);
delete buf;
break;
case 1: //替代
size=stru1.specification_long+stru1.record_long*(unsigned)(no-1)+1;
RDbf.Seek(size,CFile::begin);
RDbf.Write(stru,stru1.record_long-1);
break;
case 2: //刪除
ff=stru1.record_long*(unsigned)(stru1.record_num-no)+1;
buf=new char[ff];
size=stru1.specification_long+stru1.record_long(unsigned)no;
RDbf.Seek(size,CFile::begin);
Rdbf.Read(buf,ff);
Rdbf.Seek(size-stru1.record_long,CFile::begin);
Rdbf.Write(buf,ff);
Rdbf.Seek(4,CFile::begin); //修改記錄數(shù)
s.n=stru1.record_num--;
RDbf.Write(s.sn,1);
delete buf;
break;
default:Rdbf.Abort();
}
}
unsigned long COperDbf::RecordNum()
{
return (stru1.record_num);
}
void COperDbf::Colse()
{
Rdbf.Close();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -