[写代码]解析自定义数据库文件的思路

  技术分享从文件中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 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。