上一篇介绍了shp文件的创建,接下来介绍dbf的创建。

推荐结合读取dbf的博客一起看!

推荐结合读取dbf的博客一起看!

推荐结合读取dbf的博客一起看!

1.Dbf头文件的创建

Dbf头文件的结构如下:

记录项数组说明:

字段类型说明:

关于每项的具体含义参照读取dbf文件的解释,这里重点解释几项:

  • HeaderByteNum指dbf头文件的字节数,数值不用除于2,具体为:从version到Reserved2(共32) + n个字段 * 每一个字段长度 32 + terminator。
  • RecordByteNum指每条记录的字节数,数值不用除于2,RecordByteNum根据记录的实际长度来写,具体为:∑每个字段的字节数(字段数量根据读取打开shp的字段数决定)。例如我的例子中写了八个字段,则一条记录的实际长度为:1(deleteFlag) + 10 + 32 + 16 + 10 + 10 + 8 + 19 + 19 = 1 + 124 =125。

2.Dbf记录实体的创建

记录实体就是每条记录,一个记录有多个字段,部分字段上存储必要的信息。由于实际上每个shp文件的表的字段数可能不一样,并且每个字段的类型不固定,需要每次判定字段类型,然后根据不同类型设置来输出信息。

但是这费时费力,根据实际情况,简化一下,读取已知字段数和字段类型的DBF的信息,或者说,根据实际需要的字段数和字段类型来输出,牺牲普遍性来获取快速结果,以后修改也不困难。

3.创建Dbf的代码

void WriteDbf(CString filename)
{//创建与Shp文件同名的指针int n = filename.ReverseFind('.');filename = filename.Left(n);filename = filename + ".dbf";FILE* m_DbfFile_fp;if ((m_DbfFile_fp = fopen(filename, "wb")) == NULL)return;//****创建dbf文件的文件头int i, j;BYTE version = 4;fwrite(&version, 1, 1, m_DbfFile_fp);CTime t = CTime::GetCurrentTime();int d = t.GetDay();int y = t.GetYear() % 2000;int m = t.GetMonth();BYTE date[3];date[0] = y;date[1] = m;date[2] = d;for (i = 0; i<3; i++)                           //记录时间fwrite(date + i, 1, 1, m_DbfFile_fp);int RecordNum = map->layer->objects.size();     //文件中的记录条数fwrite(&RecordNum, sizeof(int), 1, m_DbfFile_fp);short HeaderByteNum = 0;                        //文件头中的字节数,暂时写0,后面要返回来修改fwrite(&HeaderByteNum, sizeof(short), 1, m_DbfFile_fp);short RecordByteNum = 0;                        //一条记录中的字节长度,暂时写0,后面要返回来修改fwrite(&RecordByteNum, sizeof(short), 1, m_DbfFile_fp);short Reserved1 = 0;fwrite(&Reserved1, sizeof(short), 1, m_DbfFile_fp);BYTE Flag4s = 0;fwrite(&Flag4s, sizeof(BYTE), 1, m_DbfFile_fp);BYTE EncrypteFlag = 0;fwrite(&EncrypteFlag, sizeof(BYTE), 1, m_DbfFile_fp);int Unused[3] = { 0,0,0 };for (i = 0; i<3; i++)fwrite(Unused + i, sizeof(int), 1, m_DbfFile_fp);BYTE MDXFlag = 0;fwrite(&MDXFlag, sizeof(BYTE), 1, m_DbfFile_fp);BYTE LDriID = 0;fwrite(&LDriID, sizeof(BYTE), 1, m_DbfFile_fp);short Reserved2 = 0;fwrite(&Reserved2, sizeof(short), 1, m_DbfFile_fp);//****写记录项数组int fieldscount = fieldscount_final;          //字段数量可以根据读取的shp文件确定for (i = 0; i< fieldscount; i++){RecordItem recordItem = recordItems[i];   //recordItems是自己设置的记录项数组(字段)的数组,//根据需求设定每个记录项数组(字段)的参数,以供调用//****name--------11     bytesfwrite(recordItem.name, 11, 1, m_DbfFile_fp);//****FieldType----1     bytesfwrite(&(recordItem.fieldType), sizeof(BYTE), 1, m_DbfFile_fp);//****Reserved3----4     bytesfwrite(&(recordItem.Reserved3), sizeof(int), 1, m_DbfFile_fp);//****FieldLength--1     bytesfwrite(&(recordItem.fieldLength), sizeof(BYTE), 1, m_DbfFile_fp);//****DecimalCount-1   bytesfwrite(&(recordItem.decimalCount), sizeof(BYTE), 1, m_DbfFile_fp);//****Reserved4----2     bytesfwrite(&(recordItem.Reserved4), sizeof(short), 1, m_DbfFile_fp);//****WorkID-------1    bytesfwrite(&(recordItem.workID), sizeof(BYTE), 1, m_DbfFile_fp);//****Reserved5----10   bytesfor (j = 0; j<5; j++)fwrite(recordItem.Reserved5 + j, sizeof(short), 1, m_DbfFile_fp);//****MDXFlag1-----1  bytesfwrite(&(recordItem.mDXFlag1), sizeof(BYTE), 1, m_DbfFile_fp);}BYTE terminator = 13;                       //头文件终止标识符fwrite(&terminator, sizeof(BYTE), 1, m_DbfFile_fp);fseek(m_DbfFile_fp, 8, SEEK_SET);           //转到头文件字节数RecordByteNum,开始重写HeaderByteNum = 32 + 32 * fieldscount + 1;  //从version到Reserved2(共32) + n个字段 * 每一个字段长度 32 + terminatorfwrite(&HeaderByteNum, sizeof(short), 1, m_DbfFile_fp);RecordByteNum = 1 + 124;                    //RecordByteNum根据记录的实际长度来写,∑每个字段的长度 // 1 + 10 + 32 + 16 + 10 + 10 + 8 + 19 + 19 = 1 + 124 =125fseek(m_DbfFile_fp, 10, SEEK_SET);          //转移每条记录长度RecordByteNumfwrite(&RecordByteNum, sizeof(short), 1, m_DbfFile_fp);fseek(m_DbfFile_fp, 0, SEEK_END);//****写dbf文件头结束//****写每条记录BYTE deleteFlag;char media[40];for (i = 1; i <= RecordNum; i++){CGeoPolygon* polygon = (CGeoPolygon*)map->layer->objects[i - 1];deleteFlag = 32;                                    //默认写32fwrite(&deleteFlag, sizeof(BYTE), 1, m_DbfFile_fp); //读取删除标记  1字节//****写 ObjectID intstringstream ss;ss << (i - 1);string str = ss.str();int length = str.length();memset(media, '\0', 40);for (int m = 0; m < 10 - length; m++)media[m] = ' ';for (int c = 10 - length; c < 10; c++)media[c] = str[c - 10 + length];for (j = 0; j<10; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp);   //--10                  //****写Dest stringmemset(media, '\0', 40);media[0] = '/';for (int c = 1; c <32; c++)media[c] = ' ';for (j = 0; j<32; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp);   //--32//****写Ec stringfor (j = 0; j<16; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp);   //--16//****写EcRm intss << -8888;str = ss.str();length = str.length();memset(media, '\0', 40);for (int m = 0; m < 10 - length; m++) media[m] = ' ';for (int c = 10 - length; c < 10; c++) media[c] = str[c - 10 + length];for (j = 0; j<10; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp);   //--10//****写Elevt intfor (j = 0; j<10; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp);   //--10//****写Cc intstr = polygon->objectAttribute;memset(media, '\0', 40);length = str.length();for (int c = 0; c < length; c++) media[c] = str[c];for (int c = length; c < 8; c++) media[c] = ' ';for (j = 0; j<8; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp);   //--8//****写shape_length doubleCString str1;double shape_length = polygon->getAllLength();str1.Format(_T("%.11e"), shape_length);memset(media, '\0', 40);media[0] = ' ';for (int c = 1; c < 16; c++) media[c] = str1[c - 1];if (str1.GetLength() == 18)for (int c = 16; c < 19; c++) media[c] = str1[c - 1];else {media[16] = '0';media[17] = str1[15];media[18] = str1[16];}//*(media + length ) = '\0';for (j = 0; j<19; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp);   //--19//****写shape_Area doubledouble shape_area = polygon->shapeArea;str1.Format(_T("%.11e"), shape_area);memset(media, '\0', 40);media[0] = ' ';for (int c = 1; c < 16; c++) media[c] = str1[c - 1];if (str1.GetLength() == 18)for (int c = 16; c < 19; c++) media[c] = str1[c - 1];else {                  media[16] = '0';media[17] = str1[15];media[18] = str1[16];}for (j = 0; j<19; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp);   //--19}//****写dbf文件记录结束fclose(m_DbfFile_fp);
}

  

下一篇将介绍Shx的创建。

转载于:https://www.cnblogs.com/fan-0802-WHU/p/10159097.html

shp系列(六)——利用C++进行Dbf文件的写(创建)相关推荐

  1. 利用输入输出流及文件类编写一个程序,可以实现在屏幕显示文本文件的功能,类似DOS命令中的type命令

    利用输入输出流及文件类编写一个程序,可以实现在屏幕显示文本文件的功能,类似DOS命令中的type命令 package p1;import java.io.BufferedReader; import ...

  2. shp系列(七)——利用C++进行Shx文件的写(创建)

    之前介绍了Shp文件和Dbf的写(创建),最后来介绍一下Shx文件的写(创建).Shx文件是三者之中最简单的一个,原因有两个:第一是Shx文件的头文件与Shp文件的头文件几乎一样(除了FileLeng ...

  3. python常识系列07-->python利用xlwt写入excel文件

    前言  读书之法,在循序而渐进,熟读而精思.--朱熹  抽空又来写一篇,毕竟知识在于分享!  一.xlwt模块是什么 python第三方工具包,用于往excel中写入数据:(ps:只能创建新表格,不能 ...

  4. 关于如何使用C++读取.dbf文件

    .dbf文件格式 .dbf文件格式描述可以看这两篇博客: DBF文件格式 shp系列(三) 关于dbf文件格式笔者不再赘述,因为上述两篇博客已经讲的很明白了.这篇文章主要是要讲怎么通过C++来读取任意 ...

  5. 用PB从ORACLE导出DBF文件,PB导出规定格式DBF文件

    最近在做一个给卫计委做数据上报的数据接口,接口要求使用奇葩的dBase 3数据库存储上报数据,忙活了几天总算搞好了,使用开发工具为powerbuild 12,222个字段的上报数据表生成DBF文件,写 ...

  6. PB导出规定格式DBF文件 dBase 3 格式 222个字段

    最近在做一个给卫计委做数据上报的数据接口,接口要求使用奇葩的dBase 3数据库存储上报数据,忙活了几天总算搞好了,使用开发工具为powerbuild 12,222个字段的上报数据表生成DBF文件,写 ...

  7. shp系列(一)——利用C++进行shp文件的读(打开)与写(创建)开言

    博客背景和目的 最近在用C++写一个底层的东西,需要读取和创建shp文件.虽然接触shp文件已经几年了,但是对于shp文件内到底包含什么东西一直是一知半解.以前使用shp文件都是利用软件(如ArcGI ...

  8. TF之VGG系列:利用预先编制好的脚本data_convert .py文件将图片格式转换为tfrecord 格式

    TF之VGG系列:利用预先编制好的脚本data_convert .py文件将图片格式转换为tfrecord 格式 目录 转换代码 转换后的结果 转换代码 python data_convert2tfr ...

  9. Java字节流读取shp_shp系列(四)——利用C++进行Shx文件的读(打开)

    1.shx文件的基本情况 shx文件又叫索引文件,主要包含坐标文件的索引信息,文件中每个记录包含对应的坐标文件记录距离坐标文件的初始位置的偏移量.通过索引文件可以很方便地在坐标文件中定位到指定目标的坐 ...

最新文章

  1. 2019-4:自考总结
  2. 洛谷 3029 [USACO11NOV]牛的阵容Cow Lineup
  3. userinits.exe, wupcltr.exe的分析及解决办法
  4. Check failed: error == cudaSuccess (35 vs. 0) CUDA driver version is insufficient for CUDA runtime
  5. 数组去重(包括es6)
  6. 用node搭一个静态服务
  7. Intel Realsense D435 python (Python Wrapper)example00: NumPy Integration 将深度帧数据转换为 Numpy 数组进行处理
  8. java excel添加公式_JAVA实现EXCEL公式专题(四)——字符串函数
  9. ansible内置模块
  10. Linux 字符设备驱动开发基础(四)—— ioctl() 函数解析
  11. 计算机二级考试模拟表单答题,2016年计算机二级考试《VFP》模拟简答试题
  12. SpringAOP和AspectJ
  13. Latex中参考文献排序
  14. 【路径规划】基于matlab GUI改进的DWA算法机器人动态避障路径规划【含Matlab源码 1271期】
  15. StringUtil
  16. 【分享】豆瓣上排名top100的书籍
  17. 聚合支付系统设计(三)
  18. vue中当图片地址无效的时候,显示默认图片
  19. 哈特曼医用音叉行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  20. 【C语言】博客之旅从学习C语言开始

热门文章

  1. JAVA去掉指定字符
  2. Spring Session 的两种刷新模式-RedisFlushMode
  3. Spring Boot静态资源访问和配置全解析
  4. springboot单元测试中@Autowired自动注入的类一直是null
  5. 日常生活 -- 开博一周年
  6. 计算机组装与维护补考论文,计算机组装与维护期末论文
  7. c语言两个数组按位合并,合并两个线性表(数组)并按照非递减排序输出,有点问题过来看看...
  8. MDM9x35MDM9x35启动流程简介
  9. Java I/O 操作及优化建议
  10. 美团Android DEX自动拆包及动态加载简介