哪里有操作DBF文件的C源码下载(十万火急) ?

happy 2000-04-30 05:25:00
...全文
319 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
happy 2000-05-09
  • 打赏
  • 举报
回复
谢谢你们

我也放弃了

fuzhenxing 2000-05-07
  • 打赏
  • 举报
回复
#include "dbf.h"
#include <dos.h>
#define OK 0
#define CANCEL -1

DBFop::DBFop(char *DBFname)
{
initDBF(DBFname,SHARE and NEEDWRITE);
}

DBFop::DBFop(char *DBFname,int op)
{
initDBF(DBFname,op);
}

void DBFop::initDBF(char *DBFname,int op)
{
int tmpi1,tmpi2;
int _access,_shflag,_mode;
// char *p;
DBFstru=NULL;
strcpy(DBFfn,DBFname);
tmpi1=op&0x00FF; // EXCLUSIVE
tmpi2=op&0xFF00; // NEEDWRITE
_access=O_BINARY;
_access and =tmpi2?O_RDWR:O_RDONLY;
_shflag=tmpi1?SH_DENYRW:SH_DENYNONE;
_mode=S_IREAD;if(tmpi2) _mode and =S_IWRITE;
DBFfp=sopen(DBFfn,_access,_shflag,_mode);
if(DBFfp!=-1)
{
read(DBFfp,&DBFhead,32);
iFieldNum=DBFhead.Addr/32-1;
dataStart=DBFhead.Addr;
DBFstru=(DBFstruType *)farmalloc(iFieldNum*32);
read(DBFfp,DBFstru,iFieldNum*32);
/*
tmpi=strlen(DBFname);
strncpy(LDXfn,DBFname,tmpi-3);
LDXfn[tmpi-3]=0;
strcat(LDXfn,"LDX");
*/
}
else
{
DBFhead.DBFcode=0;
DBFhead.Len=16;
}
if(DBFhead.DBFcode==-11)
{
tmpi1=strlen(DBFname);
strncpy(FPTfn,DBFname,tmpi1-3);
FPTfn[tmpi1-3]=0;
strcat(FPTfn,"FPT");
FPTfp=sopen(FPTfn,_access,_shflag,_mode);
cHasFPT=1;
}
else cHasFPT=0;
dataBuf[0]=dataBuf[1]=dataBuf[2]=dataBuf[3]=NULL;
recPerBuf=64000L/DBFhead.Len;
isOpen=1;
cHasMEM=0;
cHasXMS=0;
cReadBuf=0;
cWriteBuf=0;
}

DBFop::~DBFop()
{
if(cReadBuf) delete readRecordBuf;
if(cWriteBuf) delete writeRecordBuf;
if(cHasMEM) freeDBFMEM();
if(cHasXMS) freeDBFXMS();
if(isOpen&&DBFfp!=-1) close(DBFfp);
if(isOpen&&FPTfp!=-1&&cHasFPT) close(FPTfp);
if(DBFstru!=NULL) farfree(DBFstru);
}

int DBFop::isOk(void)
{
return DBFfp!=-1?1:0;
}

int DBFop::isDBFok(void)
{
return DBFfp!=-1?OK:CANCEL;
}

long DBFop::getDBFnum(void)
{
return DBFhead.Num;
}

int DBFop::reLoadDBFhead(void)
{
if(DBFfp==-1) return 1;
lseek(DBFfp,0,0);
read(DBFfp,&DBFhead,32);
return 0;
}

int DBFop::getDBFrecord(long lRecordNo,char *cRetChar)
{
return getDBFrecord(lRecordNo,cRetChar,0);
}

int DBFop::getDBFrecord(long lRecordNo,char *cRetChar,int len)
{
if(lRecordNo>=DBFhead.Num)
{
*cRetChar=0;return 2;
}
lseek(DBFfp,lRecordNo*DBFhead.Len+DBFhead.Addr,0);
read(DBFfp,cRetChar,DBFhead.Len-len);
cRetChar[DBFhead.Len-len]=0;
return 0;
}
sunsol 2000-05-02
  • 打赏
  • 举报
回复
问一下文件结尾的1A标志怎么在我用foxplus手动append单条记录时
没有出现?
syz 2000-04-30
  • 打赏
  • 举报
回复
不知你想干什麽?我曾经也有你一样的问题,后来放弃了,因为还是用FOX 比较方便。
访问DBF 就象用DBC驱动比较来的快,不知你是不是想寻求刺激?那就去“文件格式”里
看看吧!要是我赶程序的话,我是不会这样做的。":-)
一般的dbf文件都是数据库操作文件,用c语言进行操作的dll很多,但是java操作的很少,我找到了一个javadbf-0[1].4.0.jar的包,但是操作效果很不理想,尤其是末尾空格和乱码问题,于是我在这个jar包的基础上进行进一步开发,在尽量不影响效率的情况下,增加了对dbf各个方面的处理功能:查询,创建,copy文件结构等功能,目前没有发现bug,说明文档在程序中很详细,以下是我的说明演示部分代码,此源码需要5个积分,主要是因为可能需求不多,卖得少,成本高,望大家海涵:) 演示部分源码: public static void main(String[] args) { // TODO Auto-generated method stub /************************************************/ /* 初始化dbf操作对象 */ /************************************************/ DBF_tool dbf = new DBF_tool(); /************************************************/ /* 创建dbf操作,生成"creatDBF.dbf",此处采用相对路径 */ /* 也可以用绝对路径进行创建 */ /************************************************/ System.out.println("正在创建dbf文件:creatDBF.dbf ..."); dbf.createFile("creatDBF.dbf"); //dbf.createFile("D:\\creatDBF.dbf");//绝对路径 /************************************************/ /* 创建dbf表头信息,此处只能一次性输入所有表头信息 */ /* 表头信息由FiledInfor类生成,然后放入vector中 */ /* 此处为:编号,姓名,年龄,salary(薪水),出生日期 */ /************************************************/ System.out.println("创建dbf文件表头信息 ..."); FiledInfor filedinfor;//表头信息对象 Vector vecTitle = new Vector(); filedinfor = new FiledInfor(); filedinfor.filedDataType = DBF_tool.FIELD_TYPE_C;//类型 filedinfor.filedName = "编 号"; //名称 filedinfor.fieldLength = 8; //长度 vecTitle.add(filedinfor); filedinfor = new FiledInfor(); filedinfor.filedDataType = DBF_tool.FIELD_TYPE_C; filedinfor.filedName = "姓 名"; filedinfor.fieldLength = 12; vecTitle.add(filedinfor); filedinfor = new FiledInfor(); filedinfor.filedDataType = DBF_tool.FIELD_TYPE_N; filedinfor.filedName = "年 龄"; filedinfor.fieldLength = 5; filedinfor.decimalCount = 0; //精度 vecTitle.add(filedinfor); filedinfor = new FiledInfor(); filedinfor.filedDataType = DBF_tool.FIELD_TYPE_F; filedinfor.filedName = "salary";//不支持"salary(**)"这种方式,但支持中英文结合 f

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧