开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 768|回复: 1
收起左侧

[已解决] 易语言如何连接DBF数据库

 关闭 [复制链接]
结帖率:63% (5/8)
发表于 2023-8-27 15:10:52 | 显示全部楼层 |阅读模式   广西壮族自治区崇左市
5精币
易语言如何连接DBF数据库文件,并修改,求大神帮助,给个源码!

最佳答案

查看完整内容

#include #include #include #include #include #include #include #include #define byte unsigned char // 常量赋值 #define MaxBuff 200000 #define COLMAX 40 #define ROWMAX 7000 #define STRLEN 20 using namespace std; // 缓冲区 char buff[MaxBuff]; // 缓冲区下标 char *buffPt,*endPt; //日期 struct Date{ int year,month,day; }; // DBF记录项 struct ColStruct { char name[STRLEN]; char mod; ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值
结帖率:100% (10/10)
发表于 2023-8-27 15:10:53 | 显示全部楼层   山西省太原市
#include <string>
#include <sstream>
#include <io.h>
#include <fcntl.h>
#include <process.h>
#include <sys\stat.h>
#include <iostream>
#include <cstring>

#define byte unsigned char

// 常量赋值
#define MaxBuff 200000
#define COLMAX 40
#define ROWMAX 7000
#define STRLEN 20

using namespace std;

// 缓冲区
char buff[MaxBuff];

// 缓冲区下标
char *buffPt,*endPt;

//日期
struct Date{

        int year,month,day;
};

// DBF记录项
struct ColStruct
{
        char name[STRLEN];
        char mod;
        int offset;
        int len;
        int preci;
        int workID;
        int MDX;
        char rows[ROWMAX][STRLEN];
};

//DBF头记录及数据实体
struct DBFstruct
{
        int version;
        Date date;
        int rowNum;
        int headSegLen;
        int colLen;
        int undoPoc;
        int possword;
        int LagDriID;
        int colNum;
        int MDX;
        ColStruct cols[COLMAX];
        bool isDel[ROWMAX];
}nDbf;

int buffLen;


void readHeadSeg();
void readCol();
void readRowData();

/*
读取DBF文件函数,参数为DBF文件路径,
使用此函数读入DBF并初始化.
*/
int getDbfFile(char path[]){

        int fid = 0;

        _sopen_s(&fid, path ,O_RDONLY | O_BINARY,_SH_DENYNO,_S_IREAD | _S_IWRITE );

        if(fid == 0) return 1;

        buffLen = _read(fid,buff,MaxBuff);

        buffPt = &buff[0] , endPt = &buff[buffLen];

        readHeadSeg();
        readCol();
        readRowData();

        return 0;
}

int getInt(){

        int tmp = *((int *) buffPt );
        buffPt += 4;
        return tmp;
}

short getShort(){

        short tmp = *((short *) buffPt );
        buffPt += 2;
        return tmp;
}

byte getByte (){ return *((byte *) buffPt ++ ); }

char getChar(){ return *((char *) buffPt ++ ); }

void dropByte(int len){ buffPt+=len; }

void getString(char *_Dst , int len){

        memcpy(_Dst , buffPt , len * sizeof(char) );
        buffPt += len;
        _Dst[len] = 0;
}

void readHeadSeg(){

        nDbf.version = getByte();

        nDbf.date.year = getByte();
        nDbf.date.month = getByte();
        nDbf.date.day = getByte();

        nDbf.rowNum = getInt();
        nDbf.headSegLen = getShort();
        nDbf.colLen = getShort();

        dropByte(2);

        nDbf.undoPoc = getByte();
        nDbf.possword = getByte();

        dropByte(12);
        nDbf.MDX = getByte();
        nDbf.LagDriID = getByte();

        dropByte(2);
}

void readCol(){

        int i = 0;
        for( ;*buffPt != 0x0D; i ++ ){

                ColStruct *nCol = &nDbf.cols[i];

                getString(nCol->name,11);
                nCol->mod = getChar();
                nCol->offset = getInt();
                nCol->len = getByte();
                nCol->preci = getByte();
                dropByte(2);
                nCol->workID = getByte();
                dropByte(10);
                nCol->MDX = getByte();

        }
        nDbf.colNum = i;

        dropByte(1);
}

void readRowData(){

        for( int i = 0 ;i < nDbf.rowNum ; i++ ){

                if(getByte() == 0x2D )
                        nDbf.isDel[i] = 0;
                else
                        nDbf.isDel[i] = 1;
                for( int j = 0 ; j < nDbf.colNum ; j++)
                        getString( nDbf.cols[j].rows[i] , nDbf.cols[j].len );

        }

}

/*
获得对应数据实体信息
参数为: < 数据实体号(也就是行号),记录项名(也就是列名),出口指针 >
_Dst为数组指针,读取到的信息将会写入_Dst数组内
*/
void getValue(int row, char colName[], void *_Dst){

        if(row < nDbf.rowNum)

                for(int  i = 0 ;i < nDbf.colNum ; i++ ){

                        if( !strcmp(nDbf.cols[i].name , colName) ){

                                strcpy_s((char *)_Dst, STRLEN ,nDbf.cols[i].rows[row]);
                                return;
                        }
                }

        strcpy_s((char *)_Dst, STRLEN ,"NULL");
}

/*
重载函数——获得对应数据实体信息
参数为: < 数据实体号(行名),记录项号(列号),出口指针 >
_Dst为数组指针,读取到的信息将会写入_Dst数组内
*/
void getValue(int row , int col, void *_Dst){

        if( col < nDbf.colNum && row < nDbf.rowNum )
                strcpy_s((char *)_Dst, STRLEN, nDbf.cols[col].rows[row]);
        else
                strcpy_s((char *)_Dst, STRLEN ,"NULL");
}


//获得数据实体总数(行数)
int getColNum() { return nDbf.colNum; }

//获得数据项总数(列数)
int getRowNum() { return nDbf.rowNum; }


找到个  DBF格式的C语言版本读取源代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

关闭

精易论坛 - 有你更精彩上一条 /2 下一条

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表