[写代码]解析自定义数据库文件的思路
从文件中getilne一整条数据,里面有各种信息,首先要分析数据的构成,然后看清楚数据的分隔符。再找找小规律就可以写出来了。这里举个小例子:
比如你要解析这样的数据:
1 0 2015 12 25 20 00 ^圣诞节^ 3 2 0 2014 06 08 22 11 ^I dont know.^ 3
可以这么写:
1 #include <iostream> 2 #include <fstream> 3 #include <cstdlib> 4 #include <cstring> 5 #include <vector> 6 7 using namespace std; 8 9 typedef struct DATA 10 { 11 int flag; 12 int year; 13 int month; 14 int day; 15 int hour; 16 int minute; 17 string message; 18 int level; 19 }DATA; 20 21 int main() 22 { 23 ifstream fileRead("data.dat"); 24 vector<DATA> data; 25 while (!fileRead.eof()) 26 { 27 char buffer[101]; //退出while,就释放了这段内存 28 DATA dataBuffer; //同上 29 fileRead.getline(buffer, sizeof(buffer)); //读一行 30 int LEN = strlen(buffer); //没办法必须这么开缓冲区 31 int left, right; //记下两个^的位置,(记^也可以用vector,我用两种方法来装B) 32 bool flag = false; //查重 33 // vector<int> count; //记下空格位置,我已经知道是7个所以不用vector,vector直接用角标运算是非法的。 34 int count[7]; //记录空格的位置 35 int num = 0; //记录空格的个数 36 bool sflag = false; //记下^的位置,只记录^之前的空格 37 for (int i = 0; i < LEN; i++) //遍历一遍,记下各种标记点 O(n) 38 { 39 if (i == 0) 40 { 41 dataBuffer.flag = buffer[i] - ‘0‘; //明显标记,直接记下flag 42 } 43 if (buffer[i] == ‘ ‘ && !sflag) 44 { 45 count[num++] = i; //记下所有空格的位置,注意要跳过^^之间的内容 46 } 47 if (flag && buffer[i] == ‘^‘) //右边的^ 48 { 49 right = i; 50 } 51 if (!flag && buffer[i] == ‘^‘) //左边的^ 52 { 53 left = i; 54 flag = true; 55 sflag = true; //空格不往右边记了 56 } 57 } 58 dataBuffer.level = buffer[LEN - 1] - ‘0‘; //记下最后一个空格的后一位是level 59 left++; //从^后一个字符开始统计 60 for (int i = 0; i < num - 1; i++)//i从0到5 61 { 62 string strtmp; 63 for (int j = count[i]; j < count[i + 1]; j++) //先把两个空格间的数字统计下来(这时候是string类型) 64 { 65 strtmp += buffer[j]; //记下当前字串 66 switch (i) 67 { 68 case 0: dataBuffer.year = atoi(strtmp.data());//year 69 case 1: dataBuffer.month = atoi(strtmp.data());//month 70 case 2: dataBuffer.day = atoi(strtmp.data());//day 71 case 3: dataBuffer.hour = atoi(strtmp.data());//hour 72 case 4: dataBuffer.minute = atoi(strtmp.data());//minute 73 } 74 } 75 } 76 for (int i = left; i < right; i++) 77 { 78 dataBuffer.message += buffer[i]; //记下message 79 // cout << buffer[i]; //利用string重载了+ 80 } 81 data.push_back(dataBuffer); //这时候把整理好的数据推进要保存的综合数据的容器中。 82 } 83 84 for (int i = 0; i < data.size(); i++) 85 { 86 cout << data[i].flag << " " 87 << data[i].year << " " 88 << data[i].month << " " 89 << data[i].day << " " 90 << data[i].hour << " " 91 << data[i].minute << " " 92 << data[i].message.data() << " " 93 << data[i].level << endl; 94 } 95 fileRead.close(); 96 return EXIT_SUCCESS; 97 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。