请教怎样用C++读写FOXPRO的DBF文件,谢谢

summber_flower 2013-08-16 07:29:06
希望读取foxpro的DBF文件,然后把内容写到TXT
xiexie
...全文
455 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-09-07
  • 打赏
  • 举报
回复
#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;
}
赵4老师 2013-09-06
  • 打赏
  • 举报
回复
引用 19 楼 u011718046 的回复:
不行啊 D:\>a test.dbf db_open error D:\>a test 弹出一个窗口 "aexe 遇到问题需要关闭",调试,退出等按钮
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
赵4老师 2013-09-06
  • 打赏
  • 举报
回复
D:\>a test
summber_flower 2013-09-05
  • 打赏
  • 举报
回复
不行啊
D:\>a test.dbf
db_open error
D:\>a test
弹出一个窗口 "aexe 遇到问题需要关闭",调试,退出等按钮
赵4老师 2013-09-02
  • 打赏
  • 举报
回复
编译dbf.c生成可执行文件dbf
summber_flower 2013-09-02
  • 打赏
  • 举报
回复
谢谢 可执行文件怎么会是dbf呢?
引用 14 楼 zhao4zhong1 的回复:
[quote=引用 13 楼 u011718046 的回复:] [quote=引用 12 楼 zhao4zhong1 的回复:] 31行void改为int 64行后加return 0; 所有cprintf改为printf再试试。
谢谢,试过了,编译能通过,但是执行不行,提示 db_open error 你的两个参数,第二个应该是 dbf文件名,第一个我不清楚有什么用 [/quote] 如果可执行文件名为dbf,想打开看的文件为abc.def ./dbf abc [/quote]
赵4老师 2013-09-02
  • 打赏
  • 举报
回复
试试将dbf.cpp改名为a.cpp 编译生成可执行文件a.out 当前目录下要有FOXPRO的DBF文件abc.dbf,输入命令 ./a.out abc 即可显示文件abc.dbf中的数据了。
summber_flower 2013-09-02
  • 打赏
  • 举报
回复
引用 16 楼 zhao4zhong1 的回复:
编译dbf.c生成可执行文件dbf
我是dbf.cpp 编译能通过,执行报错 dbf open error
赵4老师 2013-09-01
  • 打赏
  • 举报
回复
引用 13 楼 u011718046 的回复:
[quote=引用 12 楼 zhao4zhong1 的回复:] 31行void改为int 64行后加return 0; 所有cprintf改为printf再试试。
谢谢,试过了,编译能通过,但是执行不行,提示 db_open error 你的两个参数,第二个应该是 dbf文件名,第一个我不清楚有什么用 [/quote] 如果可执行文件名为dbf,想打开看的文件为abc.def ./dbf abc
summber_flower 2013-08-31
  • 打赏
  • 举报
回复
引用 10 楼 super_admi 的回复:
目测楼主是伸手党。
谢谢,我不是啥伸手党,我自己也学,初学C++,很多问题对你们那样的大牛来说很简单,对我来说很难
summber_flower 2013-08-31
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
31行void改为int 64行后加return 0; 所有cprintf改为printf再试试。
谢谢,试过了,编译能通过,但是执行不行,提示 db_open error 你的两个参数,第二个应该是 dbf文件名,第一个我不清楚有什么用
赵4老师 2013-08-31
  • 打赏
  • 举报
回复
31行void改为int 64行后加return 0; 所有cprintf改为printf再试试。
super_admi 2013-08-30
  • 打赏
  • 举报
回复
目测楼主是伸手党。
summber_flower 2013-08-30
  • 打赏
  • 举报
回复
谢谢,编译不通过,报错 c:\>g++ test.cpp test.cpp:29:32: error: '::main' must return 'int' test.cpp: In function 'int main(int, char**)': test.cpp:31:28: error: 'cprintf' was not declared in this scope test.cpp:36:28: error: 'cprintf' was not declared in this scope 改成 test.c 也不行 ,我用的minGW
引用 8 楼 zhao4zhong1 的回复:
仅供参考
#include <stdio.h>
#include <string.h>
#include <share.h>
#include <conio.h>
//-------------------------------------------------------
typedef struct HeadOfDbf {
    unsigned char tab;
    unsigned char year;
    unsigned char month;
    unsigned char day;
    unsigned long recnum;
    unsigned int  offset;
    unsigned int  reclen;
    char  save[20];
} InfoOfDbfHead;
typedef struct HeadOfDbfIndex {
    unsigned char fname[11];
    unsigned char type;
    long addr;
    unsigned char width;
    unsigned char doc;
    char save[14];
} InfoOfDbfIndex;
InfoOfDbfHead      Head;
InfoOfDbfIndex     Index[48];
int offset[48],n;
FILE            *fdbf;
unsigned int    rec,field,fieldnum,i;
char buf[128];
//-------------------------------------------------------
void main(int argc,char *argv[])
{
    if (argc==1) {
        cprintf("DBF name[.DBF]");
        return;
    }
    strcpy(buf,argv[1]);
    strcat(buf,".dbf");
    if ((fdbf=_fsopen(buf,"r+b",SH_DENYNO))==NULL) {
        cprintf("db_open error");
        return;
    }
    fseek(fdbf,0L,SEEK_SET);
    fread(&Head,sizeof(InfoOfDbfHead),1,fdbf);
    fieldnum=(Head.offset-1)/32-1;

    fseek(fdbf,32,SEEK_SET);
    n=0;
    for(i=0;i<fieldnum;i++) {
        offset[i]=n;
        fread(&Index[i],sizeof(InfoOfDbfIndex),1,fdbf);
        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);
}
赵4老师 2013-08-19
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <string.h>
#include <share.h>
#include <conio.h>
//-------------------------------------------------------
typedef struct HeadOfDbf {
    unsigned char tab;
    unsigned char year;
    unsigned char month;
    unsigned char day;
    unsigned long recnum;
    unsigned int  offset;
    unsigned int  reclen;
    char  save[20];
} InfoOfDbfHead;
typedef struct HeadOfDbfIndex {
    unsigned char fname[11];
    unsigned char type;
    long addr;
    unsigned char width;
    unsigned char doc;
    char save[14];
} InfoOfDbfIndex;
InfoOfDbfHead      Head;
InfoOfDbfIndex     Index[48];
int offset[48],n;
FILE            *fdbf;
unsigned int    rec,field,fieldnum,i;
char buf[128];
//-------------------------------------------------------
void main(int argc,char *argv[])
{
    if (argc==1) {
        cprintf("DBF name[.DBF]");
        return;
    }
    strcpy(buf,argv[1]);
    strcat(buf,".dbf");
    if ((fdbf=_fsopen(buf,"r+b",SH_DENYNO))==NULL) {
        cprintf("db_open error");
        return;
    }
    fseek(fdbf,0L,SEEK_SET);
    fread(&Head,sizeof(InfoOfDbfHead),1,fdbf);
    fieldnum=(Head.offset-1)/32-1;

    fseek(fdbf,32,SEEK_SET);
    n=0;
    for(i=0;i<fieldnum;i++) {
        offset[i]=n;
        fread(&Index[i],sizeof(InfoOfDbfIndex),1,fdbf);
        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);
}
赵4老师 2013-08-19
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
summber_flower 2013-08-19
  • 打赏
  • 举报
回复
为什么读一个二进制文件,都是用0x0B 这样的16进制来判断的呢?
5t4rk 2013-08-17
  • 打赏
  • 举报
回复
你得二进制读去DBF文件到内存。 然后按照DBF的文件格式进行解析。 解析出的数据然后转化成字符。。 重新写入到TXT
summber_flower 2013-08-17
  • 打赏
  • 举报
回复
想请教一下: 1. dbf文件可以像文本文件那样 getline吗? 2. dbf文件里是一条记录一行吗?每条记录末尾有换行符? 谢谢
summber_flower 2013-08-17
  • 打赏
  • 举报
回复
引用 3 楼 bjtbjt 的回复:
http://pan.baidu.com/share/link?shareid=2525546639&uk=3895584076 完整C++工程代码和测试实例。 提供给你下载。
谢谢,我先看看,那个EXE好像没法执行,提示路径不正确 其实我不需要这么复杂,只要一个命令行就行
加载更多回复(2)

64,649

社区成员

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

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