Форум программистов, компьютерный форум CyberForum.ru

Парсер лога с использованием boost::regex - C++

Восстановить пароль Регистрация
 
lizard
 Аватар для lizard
0 / 0 / 0
Регистрация: 20.09.2011
Сообщений: 14
10.11.2011, 23:16     Парсер лога с использованием boost::regex #1
Всем привет.

Есть задача пропарсить лог антивирусника с ипользованием boot:: regex, и выдать формат Filename - Diagnosis. Лог не очень удобен, так как записывает все в несколько строк.
Алгоритм: программа находит имя просканированного файла и проверяет будет ли дальше сообщение о вирусах.

Выражения составил, логика работает правильно, но программа выдав ответ по первому файлу закрывается.

Подскажите что неправильно с while`ами?

текст лога:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Avira / Windows Version 1.9.150.0
Copyright (c) 2010 by Avira GmbH
All rights reserved.
 
engine set:         8.2.6.84
VDF Version:        7.11.16.66 
 
 
Scan start time: 09.11.2011 23:42:17
Command line: scancl.exe C:\tmp\ --log=C:\log\log 
 
configuration file: C:\avira\scancl.conf
C:\tmp\1.jpg
 Date: 02.11.2011 Time: 11:13:39  Size: 47999
 
C:\tmp\bdc.exe
 Date: 17.10.2011 Time: 21:06:17  Size: 137728
 
C:\tmp\client.exe
 Date: 19.10.2011 Time: 19:47:51  Size: 14336
 
C:\tmp\eicar.com.txt
 Date: 09.11.2011 Time: 23:41:06  Size: 68
 ALERT: [Eicar-Test-Signature] C:\tmp\eicar.com.txt <<< Contains signature of the Eicar-Test-Signature virus
C:\tmp\server.exe
 Date: 18.10.2011 Time: 19:33:52  Size: 14848
 
C:\tmp\settings.ini
 Date: 28.10.2011 Time: 13:04:02  Size: 8192
 
                                                                                
 
Statistics :                
    Directories............... : 1
    Files..................... : 6
        Infected.............. : 1
            Ignored........... : 1
        Warnings.............. : 0
        Suspicious............ : 0
    Infections................ : 1
    Time...................... : 00:00:01
код программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <string> 
#include <boost/regex.hpp>
#include <fstream>
 
using namespace std;
const int BUFSIZE = 10000;
int main()
{
 
char buf[BUFSIZE];
std::string name, iname, diagnosis;   
 
static const boost::regex infected("(ALERT:.*?.C:.tmp.*?)+(([a-zA-Z0-9]+\\.)+[a-zA-Z]{2,4})+(.<<<.+[a-zA-Z_])");
static const boost::regex healthy("(^C:.tmp.*?)+(([a-zA-Z0-9]+\\.)+[a-zA-Z]{2,4})");
 
ifstream in;
in.open("C:\\log\\avira_log.txt");
 
 
while (!in.eof()) 
{
in.getline(buf, BUFSIZE-1);
std::string s = buf;
    boost::smatch m;
    
    if ( boost::regex_search( s, m, healthy ) ) {
        
                
   name.assign(m[2]);
   cout << "Name: "<< name <<"  diagnosis:";
    
   
   // infected files
  
   while (!in.eof()) 
{
in.getline(buf, BUFSIZE-1);
std::string c = buf;
    
 
    if ( boost::regex_search( c, m, infected ) ) {
        
   iname.assign(m[2]);
   diagnosis.assign(m[4]);
 
   if ( name == iname)
   cout <<  diagnosis << endl;
   else
       cout << "OK"<< endl;
    } 
 }
}
}
 
system("pause");
 
}


Ошибка элементарная где-то, но я не заметил(

Буду благодарен помощи (:
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2011, 23:16     Парсер лога с использованием boost::regex
Посмотрите здесь:

Создание лога программы C++
C++ regex
C++ Вылетает boost::regex в windows forms, в консоли всё нормально
Boost::regex не могу сформировать ссылку на паттерн при поиске C++
Считывание из лога C++
Регулярное выражение boost::regex C++
C++ Создание лога работы программы
При записи Лога не заполняется файл C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
10.11.2011, 23:20     Парсер лога с использованием boost::regex #2
lizard, смотрите:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <string>
#include <boost/regex.hpp>
#include <fstream>
 
using namespace std;
const int BUFSIZE = 10000;
 
int main()
{
 
    char buf[BUFSIZE];
    std::string name, iname, diagnosis;
 
    static const boost::regex infected( "(ALERT:.*?.C:.tmp.*?)+(([a-zA-Z0-9]+\\.)+[a-zA-Z]{2,4})+(.<<<.+[a-zA-Z_])" );
    static const boost::regex healthy( "(^C:.tmp.*?)+(([a-zA-Z0-9]+\\.)+[a-zA-Z]{2,4})" );
 
    ifstream in;
    in.open( "C:\\log\\avira_log.txt" );
 
 
    while( !in.eof() )
    {
        in.getline( buf, BUFSIZE - 1 );
        std::string s = buf;
        boost::smatch m;
 
        if( boost::regex_search( s, m, healthy ) ) 
        {
            name.assign( m[2] );
            cout << "Name: " << name << "  diagnosis:";
            
            // infected files
 
            while( !in.eof() )
            {
                in.getline( buf, BUFSIZE - 1 );
                std::string c = buf;
 
 
                if( boost::regex_search( c, m, infected ) ) 
                {
 
                    iname.assign( m[2] );
                    diagnosis.assign( m[4] );
 
                    if( name == iname )
                        cout <<  diagnosis << endl;
                    else
                        cout << "OK" << endl;
                } // if( boost::regex_search( c, m, infected ) ) 
                
            } // while( !in.eof() )
            
/*-------------------> вот тут уже in.eof() == true <--------------------------------------------- */
            
        } // if( boost::regex_search( s, m, healthy ) )
        
    }// while( !in.eof() )
 
    system( "pause" );
 
}
Код ваш, только оформление подкантовал.
Yandex
Объявления
10.11.2011, 23:20     Парсер лога с использованием boost::regex
Ответ Создать тему
Опции темы

Текущее время: 02:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru