日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發(fā)布時(shí)間:2025/3/15 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shp系列(六)——利用C++进行Dbf文件的写(创建) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

上一篇介紹了shp文件的創(chuàng)建,接下來介紹dbf的創(chuàng)建。

推薦結(jié)合讀取dbf的博客一起看!

推薦結(jié)合讀取dbf的博客一起看!

推薦結(jié)合讀取dbf的博客一起看!

?

?

1.Dbf頭文件的創(chuàng)建

Dbf頭文件的結(jié)構(gòu)如下:

記錄項(xiàng)數(shù)組說明:

字段類型說明:

?

關(guān)于每項(xiàng)的具體含義參照讀取dbf文件的解釋,這里重點(diǎn)解釋幾項(xiàng):

  • HeaderByteNum指dbf頭文件的字節(jié)數(shù),數(shù)值不用除于2,具體為:從version到Reserved2(共32) + n個(gè)字段 * 每一個(gè)字段長(zhǎng)度 32 + terminator。
  • RecordByteNum指每條記錄的字節(jié)數(shù),數(shù)值不用除于2,RecordByteNum根據(jù)記錄的實(shí)際長(zhǎng)度來寫,具體為:∑每個(gè)字段的字節(jié)數(shù)(字段數(shù)量根據(jù)讀取打開shp的字段數(shù)決定)。例如我的例子中寫了八個(gè)字段,則一條記錄的實(shí)際長(zhǎng)度為:1(deleteFlag) + 10 + 32 + 16 + 10 + 10 + 8 + 19 + 19 = 1 + 124 =125。

2.Dbf記錄實(shí)體的創(chuàng)建

記錄實(shí)體就是每條記錄,一個(gè)記錄有多個(gè)字段,部分字段上存儲(chǔ)必要的信息。由于實(shí)際上每個(gè)shp文件的表的字段數(shù)可能不一樣,并且每個(gè)字段的類型不固定,需要每次判定字段類型,然后根據(jù)不同類型設(shè)置來輸出信息。

但是這費(fèi)時(shí)費(fèi)力,根據(jù)實(shí)際情況,簡(jiǎn)化一下,讀取已知字段數(shù)和字段類型的DBF的信息,或者說,根據(jù)實(shí)際需要的字段數(shù)和字段類型來輸出,犧牲普遍性來獲取快速結(jié)果,以后修改也不困難。

?

3.創(chuàng)建Dbf的代碼

void WriteDbf(CString filename) {//創(chuàng)建與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;//****創(chuàng)建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++) //記錄時(shí)間fwrite(date + i, 1, 1, m_DbfFile_fp);int RecordNum = map->layer->objects.size(); //文件中的記錄條數(shù)fwrite(&RecordNum, sizeof(int), 1, m_DbfFile_fp);short HeaderByteNum = 0; //文件頭中的字節(jié)數(shù),暫時(shí)寫0,后面要返回來修改fwrite(&HeaderByteNum, sizeof(short), 1, m_DbfFile_fp);short RecordByteNum = 0; //一條記錄中的字節(jié)長(zhǎng)度,暫時(shí)寫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);//****寫記錄項(xiàng)數(shù)組int fieldscount = fieldscount_final; //字段數(shù)量可以根據(jù)讀取的shp文件確定for (i = 0; i< fieldscount; i++){RecordItem recordItem = recordItems[i]; //recordItems是自己設(shè)置的記錄項(xiàng)數(shù)組(字段)的數(shù)組,//根據(jù)需求設(shè)定每個(gè)記錄項(xiàng)數(shù)組(字段)的參數(shù),以供調(diào)用//****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; //頭文件終止標(biāo)識(shí)符fwrite(&terminator, sizeof(BYTE), 1, m_DbfFile_fp);fseek(m_DbfFile_fp, 8, SEEK_SET); //轉(zhuǎn)到頭文件字節(jié)數(shù)RecordByteNum,開始重寫HeaderByteNum = 32 + 32 * fieldscount + 1; //從version到Reserved2(共32) + n個(gè)字段 * 每一個(gè)字段長(zhǎng)度 32 + terminatorfwrite(&HeaderByteNum, sizeof(short), 1, m_DbfFile_fp);RecordByteNum = 1 + 124; //RecordByteNum根據(jù)記錄的實(shí)際長(zhǎng)度來寫,∑每個(gè)字段的長(zhǎng)度 // 1 + 10 + 32 + 16 + 10 + 10 + 8 + 19 + 19 = 1 + 124 =125fseek(m_DbfFile_fp, 10, SEEK_SET); //轉(zhuǎn)移每條記錄長(zhǎng)度RecordByteNumfwrite(&RecordByteNum, sizeof(short), 1, m_DbfFile_fp);fseek(m_DbfFile_fp, 0, SEEK_END);//****寫dbf文件頭結(jié)束//****寫每條記錄BYTE deleteFlag;char media[40];for (i = 1; i <= RecordNum; i++){CGeoPolygon* polygon = (CGeoPolygon*)map->layer->objects[i - 1];deleteFlag = 32; //默認(rèn)寫32fwrite(&deleteFlag, sizeof(BYTE), 1, m_DbfFile_fp); //讀取刪除標(biāo)記 1字節(jié)//****寫 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文件記錄結(jié)束fclose(m_DbfFile_fp); }

  

下一篇將介紹Shx的創(chuàng)建。

轉(zhuǎn)載于:https://www.cnblogs.com/fan-0802-WHU/p/10159097.html

總結(jié)

以上是生活随笔為你收集整理的shp系列(六)——利用C++进行Dbf文件的写(创建)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。