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

Задача сродни отчетникам... - C++

Восстановить пароль Регистрация
 
AlgoRythm
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 12
28.09.2011, 16:19     Задача сродни отчетникам... #1
Доброго времени суток!
Помещаю в этот форум т. к. задача, скорее всего, решается элементарно, но новичком себя назвать не могу...
Значит, дело обстоит так: есть шаблон файла(это файл конфигурации виртуального хоста). Выглядит он так:
XML
1
2
3
4
5
6
7
8
9
10
11
<VirtualHost *:80>
 ServerName {__SERVERNAME__}
 ServerAlias {__SERVERALIAS__}
 ServerAdmin {__SERVERADMIN__}
 DocumentRoot {__DOCUMENTROOT__}
 <Directory />
  {__ROOTDIRCONFIG__}
 </Directory>
 ErrorLog {__ERRORLOGLOCATION__}
 CustomLog {__CUSTOMLOGLOCATION__}
</VirtualHost>
Собственно, это - файл шаблона конфига. Надо обработать его так, чтобы заменить {__ЗНАЧЕНИЯ__} реальными. Напрашивается решение распарсить XML и сгенерить новый, но как-то не хочется... Разбирать документ и построчно заменять в нем шаблоны на значения - можно, но тогда как лучше это сделать? Или разбирать его на регулярки вида /{__*__}/ и потом по этим же регуляркам заменять? Но тогда все-равно замену организовывать надо, опять же, построчную т. к. замена по регуляркам - тяжелая по процессору для такой элементарной задачи...
В общем, как бы вы сами ее решили?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.09.2011, 16:26     Задача сродни отчетникам... #2
find & replace зачем еще изобретать велосипед
DKOI
 Аватар для DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
28.09.2011, 16:29     Задача сродни отчетникам... #3
Если это только шаблон, то есть создаваться будет новый файл с конкретными значениями, то просто построчно считываете, определяете 'тег', положим DocumentRoot (а так как он должен быть отделен каким либо символом (пробелом, например) от значения, это сделать не трудно), переносите в целевой файл и потом дописываете нужное значение.
AlgoRythm
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 12
28.09.2011, 16:32  [ТС]     Задача сродни отчетникам... #4
Цитата Сообщение от DKOI Посмотреть сообщение
Если это только шаблон, то есть создаваться будет новый файл с конкретными значениями, то просто построчно считываете, определяете 'тег', положим DocumentRoot (а так как он должен быть отделен каким либо символом (пробелом, например) от значения, это сделать не трудно), переносите в целевой файл и потом дописываете нужное значение.
А как тогда лучше всего определить тег? Регулярки? Их использовать не охота т. к. они - медленные(разумеется, у всех есть нормальное железо, но все-же...). Если не сложно, то пару строк кода хотелось бы увидеть...
DKOI
 Аватар для DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
28.09.2011, 16:52     Задача сродни отчетникам... #5
Цитата Сообщение от AlgoRythm Посмотреть сообщение
А как тогда лучше всего определить тег? Регулярки? Их использовать не охота т. к. они - медленные(разумеется, у всех есть нормальное железо, но все-же...). Если не сложно, то пару строк кода хотелось бы увидеть...
Зачем регулярки?
Считали до пробела, проверили, что енто за ерунда (ифами, или можно простенький хеш посчитать и в switch засунуть) и в соответствии с ним поставили, пошли дальше.

Добавлено через 13 минут
А если код, то например.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   FILE * pFile;
   char mystring [100];
   pFile = fopen ("myfile.txt" , "r");
while (fgets (mystring , 100 , pFile) != NULL ) {
   int hash = 0;
   int i = 0;
   while ((mystring[i] != ' ') && (mystring[i] != '\n') && (mystring[i] != -1)) {
     add_hash(mystring[i], &hash);
     i++;
  }
  switch (hash) {
  ...
  }
}
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.09.2011, 17:08     Задача сродни отчетникам... #6
AlgoRythm, можно так

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <fstream>
#include <string>
#include <map>
 
using namespace std;
 
typedef map<string, string> varmap_t;
 
void var( istream &is, ostream &os, varmap_t &vars )
{
    char ch;
    string varname;
 
    // пропускаем все _
    do
        ch = is.get();
    while( !is.eof() && ch == '_' );
 
    is.putback( ch );
    getline( is, varname, '_' );
 
    // пропускаем все _
    do
        ch = is.get();
    while( !is.eof() && ch == '_' );
 
    if( ch != '}' ) // если в конце нет {
    {
       cerr << "WARNING: \"}\" expected after " << varname << " var. Got \"" << ch << "\".\n";
       os << "{__" << varname << "__}";
       is.putback( ch );
    }
    else // если формат соблюдён
    {
        if( vars[varname].length() > 0 )
           os << vars[varname];
        else
        {  // если такого алиаса нет в списке
           cerr << "WARNING: unknown alias \"" << varname << "\" encountered.\n";
           os << "{__" << varname << "__}";
        }
    }
}
 
int main( )
{
    varmap_t varmap;
 
    // при желании это тоже можно загрузить из файла
    varmap["SERVERNAME"] = "MilleniumFalcon";
    varmap["SERVERALIAS"] = "HanSoloGunship";
    varmap["SERVERADMIN"] = "HanSolo";
    varmap["DOCUMENTROOT"] = "/home/falcon/httpd/docroot";
    varmap["CUSTOMLOGLOCATION"] = "/home/falcon/logs";
 
    ifstream ifs( "in.txt" );
 
    if( !ifs.is_open() )
    {
        cerr << "could not open in.txt\n";
        return 1;
    }
 
    ofstream ofs( "out.txt" );
 
    if( !ofs.is_open() )
    {
        cerr << "could not open out.txt\n";
        ifs.close();
        return 1;
    }
 
 
    char ch;
 
    while( (ch = ifs.get()) && !ifs.eof() )
    {
        if( ch == '{' )
           var( ifs, ofs, varmap );
        else
           ofs << ch;
    }
 
    ifs.close();
    ofs.close();
 
    return 0;
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
29.09.2011, 05:35     Задача сродни отчетникам... #7
Цитата Сообщение от AlgoRythm
В общем, как бы вы сами ее решили?
через конечный автомат
Yandex
Объявления
29.09.2011, 05:35     Задача сродни отчетникам...
Ответ Создать тему
Опции темы

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