📄 opendbf.cpp
字号:
#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(); //打开数据库文件,没有则关闭
RDbf.Read((char*)&stru1,32); //分别将结构及字段说明读入结构体
zd_num=(int)(struc1.specification_long-32-1)/32; //计算字段个数
for (int i=0;i<zd_num;i++)
RDbf.Read((char*)&stru2[i],32);
size_c_x+=stru1.specification_long; //结构说明部分的字节数+1
return TRUE;
}
void COper Dbf::Read(const char *msg_c,char *buf,int zd)
{
find_x=-1; //先将所要查找的字段设为-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; //打到相应的字段名,则将该字段号赋与find_x
break;
}
}
if(find_x==-1) //数据库中没有所要寻找的字段名时
{
AfxMessageBox("数据库没有相应的字段名!",MB_OK|MB_ICONINFORMATION);
RDbf.Abort();
return;
}
if(zd==0) //如果是第一个字段
size_c=size_c_x; //第一条记录中第一个字段的位置
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; //现已处于所要读的字段起始位置
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: //插入,将插入项后的所有记录读入内存
if(no==-1) //如果要插入文件尾
no=stru1.record_num+1; //记录数加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);标志
for(int i=0;i<num;i++) //将所插入内容写入数据库
{
RDbf.Seek(size,CFile::begin);
RDbf.Write(",",); //越过一个删除
RDbf.Write(stur[i],stru1.record_long-1);
size+=stru1.record_long-1;
}
RDbf.Write(buf,ff);
RDbf.Seek(4,CFile::begin); //修改记录数
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); //修改记录数
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();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -