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

  从文件中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 <cstring>
  4 #include <vector>
  5 using namespace std;
  6 
  7 enum ATTRIBUTE {year, month, day, hour, minute};
  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 vector<DATA> convert()
 22 {
 23     ifstream fileRead("data.dat");
 24     vector<DATA> data;
 25     while (!fileRead.eof())
 26     {
 27         char buffer[101];    //退出while,就释放了这段内存
 28         DATA dataTemp;    //同上
 29         fileRead.getline(buffer, sizeof(buffer));    //读一行
 30         int LEN = strlen(buffer);    //没办法必须这么开缓冲区
 31         int left, right;    //记下两个^的位置,(记^也可以用vector)
 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++)    //遍历一遍,记下各种标记点
 38         {
 39             if (i == 0)
 40             {
 41                 dataTemp.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         dataTemp.level = buffer[LEN - 1] - '0';    //记下最后一个空格的后一位是level
 59         for (int i = 0; i < num - 1; i++)    //举出所有空格,最后一个特殊,不记
 60         {
 61             string strtmp;
 62             for (int j = count[i]; j < count[i + 1]; j++)    //先把两个空格间的数字统计下来(这时候是string类型)
 63             {
 64                 strtmp += buffer[j];    //记下当前字串
 65             }
 66             switch (i)    //按数据的属性扔到dataTemp里
 67             {
 68             case year: dataTemp.year = atoi(strtmp.data()); break;//year
 69             case month: dataTemp.month = atoi(strtmp.data()); break;//month
 70             case day: dataTemp.day = atoi(strtmp.data()); break;//day
 71             case hour: dataTemp.hour = atoi(strtmp.data()); break;//hour
 72             case minute: dataTemp.minute = atoi(strtmp.data()); break;//minute
 73             }
 74         }
 75         ++left;        //从^后一个字符开始统计
 76         for (int i = left; i < right; i++)
 77         {
 78             dataTemp.message += buffer[i];    //记下message
 79 //            cout << buffer[i];    //利用string重载了+
 80         }
 81         data.push_back(dataTemp);    //这时候把整理好的数据推进要保存的综合数据的容器中。
 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 data;
 97 }
 98 
 99 int main()
100 {
101     convert();
102     return EXIT_SUCCESS;
103 }

 

posted @ 2015-06-06 22:49  Kirai  阅读(352)  评论(0编辑  收藏  举报