Advertisement
Queen4

Parsing logs 1.1

Jan 9th, 2020
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <unordered_set>
  5.  
  6. // Переменные для поиска времени
  7. struct MainTime {
  8.     int hour = 0;
  9.     int nexthour = 0;
  10.     int minute = 0;
  11.     int nextminute = 0;
  12.     float sec = 0.0;
  13.     float nextsec = 0.0;
  14. };
  15.  
  16. // Cкладывает по принципу XOR
  17. int XOR(const char* s){
  18.     int c = 0;
  19.  
  20.     while (*s)
  21.         c ^= *s++;
  22.  
  23.     return c;
  24. }
  25.  
  26. int main() {
  27.     int k, key; // Переменная для "доставания" SNR и имени спутника из строки и переменная для проверки контрольной суммы
  28.     MainTime time; //Структура времени
  29.     // Переменные для работы со строками
  30.     char linec_h[200];
  31.     std::string line, key_s;
  32.     // Работа с массивом номеров спутника
  33.     std::unordered_set<int> S;
  34.     int t;
  35.  
  36.     std::ifstream logs_("C:/Users/Ivan/Desktop/LogGLO.txt"); // Откуда берем данные
  37.     std::ofstream pout("C:/Users/Ivan/Desktop/outLOG.txt"); // Куда загружаем
  38.  
  39.     if (logs_.is_open()) {
  40.         while (getline(logs_, line)) {
  41.  
  42.             if (line.substr(0, 9) == "RE004%on%") { // Если строка с включением, то
  43.                 pout << "Time of work: "<< time.nexthour + time.nextminute + time.nextsec << " sec" <<  std::endl; // Выводим время работы цикла
  44.                 // Обнуляем переменные времени
  45.                 time.hour = 0;
  46.                 time.minute = 0;
  47.                 time.sec = 0.0;
  48.                 time.nexthour = 0;
  49.                 time.nextminute = 0;
  50.                 time.nextsec = 0.0;
  51.                 // Очищаем ведро
  52.                 S.clear();
  53.             }
  54.             else {
  55.                 //Проверяем контрольную сумму
  56.                 key_s = line.substr(line.length() - 2, 2);
  57.                 key = strtol(key_s.c_str(), nullptr, 16);
  58.                 line = line.substr(1, line.length() - 4);
  59.                 strcpy_s(linec_h, line.c_str());
  60.                 if (key = XOR(linec_h)) { //Если выполняется, то
  61.                     k = 0;
  62.                     // Находим время, переводим в секунды, находим отношение первого значения и всех следующих
  63.                     if (line.substr(0, 5) == "GPGGA") {
  64.                         if (time.hour == 0 && time.minute == 0 && time.sec == 0.0) {
  65.                             time.hour = stoi(line.substr(6, 2)) * 3600;
  66.                             time.minute = stoi(line.substr(8, 2)) * 60;
  67.                             time.sec = stof(line.substr(10, 4));
  68.                         }
  69.                         else {
  70.                             time.nexthour = stoi(line.substr(6, 2)) * 3600 - time.hour;
  71.                             time.nextminute = stoi(line.substr(8, 2)) * 60 - time.minute;
  72.                             time.nextsec = stof(line.substr(10, 4)) - time.sec;
  73.                         }
  74.                     }
  75.                     // Если строка GPGSV
  76.                     else if (line.substr(0, 5) == "GPGSV") {
  77.                         // Проходимся по строке
  78.                         for (size_t i = 0, N = 4; i < line.size(); i++) {
  79.                             // Считаем количество запятых
  80.                             if (line[i] == ',') k++;
  81.                             // При нахождении нужного количества
  82.                             if (k == N) {
  83.                                 t = stoi(line.substr(i + 1, 2)); // Присваиваем значение из строки переменной
  84.                                 if (S.find(t) == S.end()) { // Ищем его в ведре, если не находим, то выводим нужные нам параметры
  85.                                     pout << "Satellite name: " << t << "  " << "SNR: " << line.substr(i + 11, 2) << "  Elapsed time : " << time.nexthour + time.nextminute + time.nextsec << " sec" << std::endl;
  86.                                     S.insert(t); // Добавляем его в ведро
  87.                                 }
  88.                                 N += 4; //Ищем следующие значения в строке
  89.                             }
  90.                         }
  91.                     }
  92.                 }
  93.             }
  94.         }
  95.         logs_.close();
  96.         std::cout << "Success" << std::endl;
  97.     }
  98.     else std::cout << "File is not open" << std::endl;
  99.     pout.close();
  100.  
  101.     return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement