1 void BlkGroupWriteReader::_WriteBlockGroup(std::string fileName, int blockGroupID, BlockGroup* blkGroup)
2 {
3 ifstream fileIn;
4 ofstream fileOut;
5 fileIn.clear();
6 fileOut.clear();
7 //test.clear();
8 ///文件转写时需要的变量
9 blkGroupStaticUnit tmpUnit;
10 int *tmpInt = NULL, i, j, k;
11 std::vector<int*> storage;
12
13 ///文件流
14 printf("Creating IFstream...\n");
15
16 fileIn.open(fileName.c_str(), ios_base::binary);
17 printf("CompleteI\n");
18 ///如果读入源不能打开,尝试新建文件
19 if(fileIn.fail())
20 {
21 printf("CANNOT OPEN FILE, CREATING NEW FILE...\n");
22 fileIn.close();
23 printf("Creating temp OFstream...\n");
24 ofstream test;
25 test.open(fileName.c_str(), ios_base::binary);
26 printf("Opening file...\n");
27 fileIn.open(fileName.c_str(), ios_base::binary);
28 if(!fileIn.fail())
29 {
30 printf("File Opened, Writing Data...\n");
31 tmpInt = 0;
32 test.write((char*)&tmpInt, sizeof(int));
33 printf("Write Complete.\n");
34 }
35 printf("Closing File...\n");
36 test.close();
37 printf("Complete.\n");
38 //delete &test;
39 printf("************************\nFileName: %s\nblockGroupID: %d\n************************\n", fileName.c_str(), blockGroupID);
40 system("pause");
41 }
42 printf("Creating OFstream..\n");
43 fileOut.open((fileName + "tmp").c_str(), ios_base::binary);
44 printf("CompleteO\n");
45 if(blockGroupID > 500)
46 {
47 printf("************************\nFileName: %s\nblockGroupID: %d\n************************\n", fileName.c_str(), blockGroupID);
48 system("pause");
49 }
50
51 if(fileIn.fail() || fileOut.fail())
52 {
53 printf("WriteBlockGroup Failed: Cannot open file!\n");
54 printf("************************\nFileName: %s\nblockGroupID: %d\n************************\n", fileName.c_str(), blockGroupID);
55 system("pause");
56 return;
57 }
58 if(blkGroup == NULL)
59 {
60 printf("WriteBlockGroup Failed: BlockGroup do NOT exist\n");
61 printf("************************\nFileName: %s\nblockGroupID: %d\n************************\n", fileName.c_str(), blockGroupID);
62 system("pause");
63 return;
64 }
65
66 ///让方块组生成静态存储单元
67 blkGroup->Group2Struct();
68
69 ///读取文件头,确认是否存在方块组
70 int blkGroupCount;
71 printf("WRI!!!!!\n");
72 fileIn.read((char*)&blkGroupCount, sizeof(int));
73 printf("WRI!!!!!\t%d\n",blkGroupCount);
74
75 ///文件中并未记录过该方块组的历史版本(方块组存储位置大于文件中的方块组数目,或存储位置<0,即在文件末尾添加该方块组),需要进行处理
76 if(blockGroupID > blkGroupCount - 1 || blockGroupID < 0)
77 {
78 blockGroupID = blkGroupCount;
79 blkGroupCount++;
80 }
81
82 ///转写文件
83 fileOut.write((char*)&blkGroupCount, sizeof(int));
84 for(i=0;i<blkGroupCount;i++)
85 {
86 ///对于不需要覆盖的方块组,照抄过去
87 if(i != blockGroupID)
88 {
89 ///7个Vector3型变量:dirc movePro rotateAim rotateSpeed rotatePro nowPos centerPos
90 for(j=0;j<7;j++)
91 {
92 fileIn.read((char*)&tmpVec3, sizeof(Vector3));
93 fileOut.write((char*)&tmpVec3, sizeof(Vector3));
94 }
95
96 ///叶子节点数目
97 fileIn.read((char*)&numLeaves, sizeof( int));
98 fileOut.write((char*)&numLeaves, sizeof( int));
99 for(j=0;j<numLeaves;j++)
100 {
101 ///叶子节点中7个int型变量:minX minY minZ maxX maxY maxZ blockData
102 for(k=0;k<7;k++)
103 {
104 fileIn.read((char*)&tmpInt, sizeof( int));
105 fileOut.write((char*)&tmpInt, sizeof( int));
106 }
107
108 ///叶子节点中1个short型变量:blockID
109 fileIn.read((char*)&tmpShort, sizeof( short));
110 fileOut.write((char*)&tmpShort, sizeof( short));
111 }
112 }
113
114 ///该方块组需要覆盖
115 else
116 {
117 fileOut.write((char*)&(blkGroup->dirc), sizeof(Vector3));
118 fileOut.write((char*)&(blkGroup->movePro), sizeof(Vector3));
119 fileOut.write((char*)&(blkGroup->rotateAim), sizeof(Vector3));
120 fileOut.write((char*)&(blkGroup->rotateSpeed), sizeof(Vector3));
121 fileOut.write((char*)&(blkGroup->rotatePro), sizeof(Vector3));
122 fileOut.write((char*)&(blkGroup->nowPos), sizeof(Vector3));
123 fileOut.write((char*)&(blkGroup->centerPos), sizeof(Vector3));
124
125 ///读取叶子节点
126 blkGroup->Group->walkLeafNode(&storage);
127 numLeaves = storage.size();
128
129 fileOut.write((char*)&numLeaves, sizeof( int));
130 for(j=0;j<numLeaves;j++)
131 {
132 tmpInt = storage.at(j)[0]>>16;
133 fileOut.write((char*)&(tmpInt), sizeof( int));
134 tmpInt = storage.at(j)[1]>>16;
135 fileOut.write((char*)&(tmpInt), sizeof( int));
136 tmpInt = storage.at(j)[2]>>16;
137 fileOut.write((char*)&(tmpInt), sizeof( int));
138 tmpInt = storage.at(j)[0]&((1<<16)-1);
139 fileOut.write((char*)&(tmpInt), sizeof( int));
140 tmpInt = storage.at(j)[1]&((1<<16)-1);
141 fileOut.write((char*)&(tmpInt), sizeof( int));
142 tmpInt = storage.at(j)[2]&((1<<16)-1);
143 fileOut.write((char*)&(tmpInt), sizeof( int));
144 tmpInt = storage.at(j)[4];
145 fileOut.write((char*)&(tmpInt), sizeof( int));
146
147 tmpShort = (short)storage.at(j)[3];
148 fileOut.write((char*)&(tmpShort), sizeof( short));
149 }
150 }
151 }
152
153 ///将转写的文件重命名
154 fileIn.close();
155 fileOut.close();
156 system(("del "+fileName).c_str());
157 system(("ren "+fileName+"tmp "+fileName).c_str());
158 if(blockGroupID > 500)
159 {
160 printf("************************\nFileName: %s\nblockGroupID: %d\n************************\n", fileName.c_str(), blockGroupID);
161 system("pause");
162 }
163 //delete &fileIn;
164 //delete &fileOut;
165 ///Last Edit: 2014-6-8 01:03(GMT+8)
166 }