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

📄 opendbf.cpp

📁 用VC实现DBF数据库文件的读取,可以实现对文件的读定
💻 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 + -