Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > [C++] Обработка лога со звуком


Автор: pograp 11.11.2010, 03:23
Здравствуйте уважаемые форумчане нужна помощь при написании программы. Есть лог в нём пишется дата, оборудование и статус необходимо обработать лог с начала и до конца. 8 железяк и статусы online\offline. Если конечное состояние у оборудования offline необходимо запустить звук (.wav) непрерывно до тех пор пока состояние у всех не будет online. Лог должен обрабатываться каждые 2 секунды. 
Уважаемые гуру помогите в выполнении нелёгкого задания, голова моя уже уничтожена, а навыки программирования затупились из-за 2-х лет отдыха. Пишу эту весчь чисто для себя.

Автор: GrayCardinal 12.11.2010, 18:25
И в чём должна выражаться "помощь" ?

Автор: pograp 12.11.2010, 22:22
Ну сейчас я уже понял некоторый момент как выделить допустим по хосту. grep HOSTNAME. Сейчас есть вопрос необходимо поставить каретку в конец файла и обработать строку и поставить условие есть строка пустая обработать следующую строку. Обработать нужно последнее слово оно же статус и дать хотябы ответ. Пример лога
12.11.2010 22:18 HOST: Servak1 192.168.0.1 status: Online 
Просьба помочь кодом или же где посмотреть на похожие работы варианты и т.д.. Мой мозг на момент написания первого поста был убит данной проблемой. С потоками разобрался с другими пакостями жизни разобрался, но лог обработать не смог - стыдно...

Автор: bsa 12.11.2010, 23:45
А причем тут С++? Это проще сделать на shell.

Автор: pograp 13.11.2010, 00:06
Понимаю что баш рулит, но я хочу научиться в С++ далее создать что-то вроде wiki или блог на гугле том же самом с моим личным опытом. Или же поделиться с другим блогописателем. Про программирование под линукс нету почти ничего а описания создания обработчика и кода - прорыв.

Автор: bsa 13.11.2010, 13:42
Код
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
#include <cctype>
#include <cstdlib>

void playSound()
{
   std::ifstream wav("/path/to/file.wav", std::ios::binary | std::ios::in);
   std::ofstream dsp("/dev/dsp", std::ios::binary | std::ios::out);
   if ( !(wav.is_open() && dsp.is_open()) )
      return; //failed to open files
   char buffer[256];
   while(wav.read(buffer, sizeof(buffer)))
       dsp.write(buffer, wav.gcount());
}

int main()
{
   std::ifstream file("/path/to/file.log");
   for(;;) {
      std::string line;
      bool need_signal = false;
      while(std::getline(file, line)) {
         if (line.empty())
            continue; //line empty
         std::string host;
         std::string status;
         {
            std::vector<std::string> words;
            std::istringstream stream(line);
            std::copy(std::istream_iterator<std::string>(stream), std::istream_iterator<std::string>(), std::back_inserter(words));
            if (words.size() < 7)
               continue;
            host = words[3];
            status = words.back();
            std::transform(status.begin(), status.end(), status.begin(), &tolower);
         }
         if (status == "offline")
            playSound();
      }
      sleep(1);
   }
   return 0;
}

Автор: pograp 14.11.2010, 15:05
Спасибо большое!!! Не могли бы Вы написать пояснения к коду (часть обработка текста).
Вечером скину тоже самое но на баше.

Автор: bsa 14.11.2010, 19:19
Цитата(pograp @  14.11.2010,  16:05 Найти цитируемый пост)
Вечером скину тоже самое но на баше. 
зачем? раздел по С/С++.

Цитата(pograp @  14.11.2010,  16:05 Найти цитируемый пост)
Не могли бы Вы написать пояснения к коду (часть обработка текста).
Строка 27: читаем файл построчно пока он не кончится
Строка 35: копируем все слова из строки в массив

Автор: xvr 15.11.2010, 15:48
Цитата(bsa @  13.11.2010,  13:42 Найти цитируемый пост)
if (status == "offline")
Я так понял, что ТС нужно отслеживать состояние по каждому серверу отдельно, и гудеть, если есть какие то сервера в offline.

2 ТС: Парсь лог построчно (bsa нарисал как). Название сервера и состояние выделяй с помощью regex'пов (pcre, boost::regex, regex.h - на выбор). Все offline сервера складывай в set<string>, online - удаляй оттуда. Если в конце обработки set не пустой - надо гудеть  smile 


Автор: MAKCim 15.11.2010, 17:27
а лучше это сделать на питоне например ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)