求一个真正能用的C++ 读取forpro DBF文件并转成 TXT的程序,谢谢

summber_flower 2013-09-06 08:53:29
求一个真正能用的C++ 读取forpro DBF文件并转成 TXT的程序,谢谢
...全文
228 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
denallo 2015-07-04
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
#include <stdio.h>
#include <string.h>
#pragma pack(push,1)
typedef struct HeadOfDbf {
    unsigned char  tab;
    unsigned char  year;
    unsigned char  month;
    unsigned char  day;
    unsigned int   recnum;
    unsigned short offset;
    unsigned short reclen;
    char  save[20];
} InfoOfDbfHead;
typedef struct HeadOfDbfIndex {
    unsigned char fname[11];
    unsigned char type;
    int  addr;
    unsigned char width;
    unsigned char doc;
    char save[14];
} InfoOfDbfIndex;
#pragma pack(pop)
InfoOfDbfHead      Head;
InfoOfDbfIndex     Index[48];
int offset[48],n;
FILE            *fdbf;
unsigned int    rec,field,fieldnum,i;
char buf[256];
//-------------------------------------------------------
int main(int argc,char *argv[])
{
    if (argc==1) {
        fprintf(stderr,"Usage:\n%s filename[.DBF]",argv[0]);
        return 1;
    }
    strcpy(buf,argv[1]);
    if (buf[strlen(buf)-4]!='.') strcat(buf,".dbf");
    if ((fdbf=fopen(buf,"rb"))==NULL) {
        fprintf(stderr,"Can not fopen file [%s]!",buf);
        return 2;
    }
    fseek(fdbf,0L,SEEK_SET);
    fread(&Head,sizeof(InfoOfDbfHead),1,fdbf);
    fieldnum=(Head.offset-1)/32-1;

    fseek(fdbf,32,SEEK_SET);
    n=0;
    printf("|");
    for(i=0;i<fieldnum;i++) {
        offset[i]=n;
        fread(&Index[i],sizeof(InfoOfDbfIndex),1,fdbf);
        printf("%-*s|",Index[i].width,Index[i].fname);
        n=n+Index[i].width;
    }

    for (rec=0;rec<Head.recnum;rec++) {
        printf("\n|");
        for (field=0;field<fieldnum;field++) {
            fseek(fdbf,(long)(Head.offset+1+rec*(long)Head.reclen+offset[field]),SEEK_SET);
            fread(buf,1,Index[field].width,fdbf);
            buf[Index[field].width]=0;
            printf("%s|",buf);
        }
    }
    fclose(fdbf);
    return 0;
}
谢谢赵老师,学习了,而且还能直接用在项目里,解决了原先DBF文件解析速度过慢的问题
summber_flower 2013-10-10
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
Excel就可以读.dbf的。
多谢zhao4zhong1 大神!
赵4老师 2013-09-06
  • 打赏
  • 举报
回复
Excel就可以读.dbf的。
赵4老师 2013-09-06
  • 打赏
  • 举报
回复
forpro和foxpro不是一回事! 关于自己是否适合编程的很简单的测试: 在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案: A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感 A不适合编程(理由:打字准确度偏低、粗心大意) B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念) C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证) D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!) 如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”
pengyw 2013-09-06
  • 打赏
  • 举报
回复
有个DBF的库,前年还移植过,可以直接在纯C下操作DBF的,可以增删改。现在工作系统加密,不能传输。 搜一下了
图灵狗 2013-09-06
  • 打赏
  • 举报
回复
数据库的操作还是用ADO直接操作,然后再根据自己的格式输出信息到TXT文件比较好。
summber_flower 2013-09-06
  • 打赏
  • 举报
回复
很感谢 zhao4zhong1 大神 我会好好学习一下 另外我有两个担心 1、如果DBF文件很大,比如5G甚至更大,会不好报错? 2、如果DBF有MEMO型字段会不会解析不正确? 3、另外我想搞个设置,比如字段3和字段5不要,也可能设置成字段1、7和字段8不要打印出来
赵4老师 2013-09-06
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#pragma pack(push,1)
typedef struct HeadOfDbf {
    unsigned char  tab;
    unsigned char  year;
    unsigned char  month;
    unsigned char  day;
    unsigned int   recnum;
    unsigned short offset;
    unsigned short reclen;
    char  save[20];
} InfoOfDbfHead;
typedef struct HeadOfDbfIndex {
    unsigned char fname[11];
    unsigned char type;
    int  addr;
    unsigned char width;
    unsigned char doc;
    char save[14];
} InfoOfDbfIndex;
#pragma pack(pop)
InfoOfDbfHead      Head;
InfoOfDbfIndex     Index[48];
int offset[48],n;
FILE            *fdbf;
unsigned int    rec,field,fieldnum,i;
char buf[256];
//-------------------------------------------------------
int main(int argc,char *argv[])
{
    if (argc==1) {
        fprintf(stderr,"Usage:\n%s filename[.DBF]",argv[0]);
        return 1;
    }
    strcpy(buf,argv[1]);
    if (buf[strlen(buf)-4]!='.') strcat(buf,".dbf");
    if ((fdbf=fopen(buf,"rb"))==NULL) {
        fprintf(stderr,"Can not fopen file [%s]!",buf);
        return 2;
    }
    fseek(fdbf,0L,SEEK_SET);
    fread(&Head,sizeof(InfoOfDbfHead),1,fdbf);
    fieldnum=(Head.offset-1)/32-1;

    fseek(fdbf,32,SEEK_SET);
    n=0;
    printf("|");
    for(i=0;i<fieldnum;i++) {
        offset[i]=n;
        fread(&Index[i],sizeof(InfoOfDbfIndex),1,fdbf);
        printf("%-*s|",Index[i].width,Index[i].fname);
        n=n+Index[i].width;
    }

    for (rec=0;rec<Head.recnum;rec++) {
        printf("\n|");
        for (field=0;field<fieldnum;field++) {
            fseek(fdbf,(long)(Head.offset+1+rec*(long)Head.reclen+offset[field]),SEEK_SET);
            fread(buf,1,Index[field].width,fdbf);
            buf[Index[field].width]=0;
            printf("%s|",buf);
        }
    }
    fclose(fdbf);
    return 0;
}
summber_flower 2013-09-06
  • 打赏
  • 举报
回复
多谢楼上几位
是一个单独的DBF文件,所以没法用ADO之类的
也不能利用DBF库之类的,因为要WIN,LINUX,UNIX都能用
因此希望就读取一个dbf文件,根据文件结构去读取记录内容,我刚开始学C++,因此不知道怎么读dbf文件

--------------------------------
是 FOXPRO,“forpro” 是我敲错了
我不适合编程。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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