zoukankan      html  css  js  c++  java
  • [写代码]解析自定义数据库文件的思路

      从文件中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 }
  • 相关阅读:
    iOS使用Charles(青花瓷)抓包并篡改返回数据图文详解(转)
    iOS 9 添加白名单
    iOS 中字体的应用(转)
    iOS 后台操作的开发(转)
    iOS 知识点大总结(转)
    在Xcode中找中文字符串(正则表达式)
    block 使用时的注意点(转)
    xcode armv6 armv7 armv7s arm64 (转)
    使用Android studio过程中发现的几个解决R变红的办法
    折腾了一晚上的“equals”和“==”
  • 原文地址:https://www.cnblogs.com/kirai/p/4557468.html
Copyright © 2011-2022 走看看