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

C++语言 码拜 10年前 (2015-07-10) 1587次浏览 0个评论
 

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

 
数据库的操作还是用ADO直接操作,然后再根据自己的格式输出信息到TXT文件比较好。
 
有个DBF的库,前年还移植过,可以直接在纯C下操作DBF的,可以增删改。现在工作系统加密,不能传输。
搜一下了
 
forpro和foxpro不是一回事!

关于自己是否适合编程的很简单的测试:
在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案:

A里面有10处以上文字或标点错误
B里面没有文字或标点错误并敢为此跟人打赌
C里面没有文字或标点错误并且字体和排版完全与原稿一致
D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感

A不适合编程(理由:打字准确度偏低、粗心大意)
B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念)
C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证)
D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!)

如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

 
Excel就可以读.dbf的。
 
多谢楼上几位
是一个单独的DBF文件,所以没法用ADO之类的
也不能利用DBF库之类的,因为要WIN,LINUX,UNIX都能用
因此希望就读取一个dbf文件,根据文件结构去读取记录内容,我刚开始学C++,因此不知道怎么读dbf文件

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

100分

#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;
}
 
很感谢 zhao4zhong1 大神
我会好好学习一下
另外我有两个担心
1、如果DBF文件很大,比如5G甚至更大,会不好报错?
2、如果DBF有MEMO型字段会不会解析不正确?
3、另外我想搞个设置,比如字段3和字段5不要,也可能设置成字段1、7和字段8不要打印出来
 
引用 4 楼 zhao4zhong1 的回复:

Excel就可以读.dbf的。

多谢zhao4zhong1 大神!

 
谢谢赵老师,学习了,而且还能直接用在项目里,解决了原先DBF文件解析速度过慢的问题

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求一个能用的C++ 读取forpro DBF文件并转成 TXT的程序
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!