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

Конфигурационный файл - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
Antisymmetrizer
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 22
28.11.2011, 19:27     Конфигурационный файл #1
Здравствуйте.
В общем, стоит задача в мою программу добавить конфигурационный файл. Пока необходимо считать из него два параметра:
1) №порта
2) dns-имя сервера
Соответственно, первый параметр число, второй- строка (или указатель на char?).

При этом сделать это надо без использования Qt и каких-либо других сторонних библиотек.
Чем готовее будет код, тем лучше.
Спасибо большое.

P.S. не могу я нормально понять работу со строками в С++
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2011, 19:27     Конфигурационный файл
Посмотрите здесь:

Дан файл целых чисел. Создать новый файл, содержащий те же элементы, что и исходный файл, но в обратном порядке C++
C++ Дан файл. Записать в другой файл строки, которые являются палиндромами.
C++ Дан символьный файл f. Записать в файл g элементы файла f в обратном порядке
C++ Скопировать текстовый файл в новый файл, заменив в каждой строке слова «ok» на «*»
Дан символьный файл f. Записать в файл g компоненты файла f в обратном порядке C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.11.2011, 20:45     Конфигурационный файл #2
вопросы где?

Добавлено через 8 секунд
наработки где?
Antisymmetrizer
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 22
28.11.2011, 21:15  [ТС]     Конфигурационный файл #3
Нашёл вот такой вот код:

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*
*вспомагательная функция
*возвращает номер символа в строке, следующего после запятой
*или ноль, если встретит символ коментария
*
*входные параметры:
* str - строка, в которой происходит сканирование
* nom - номер элемента, начиная с которого нужно производить поиск
*
*возвращаемое значение - номер символа, ПОСЛЕ которого стоит запятая
*
*/
int get_parm_offset(char * str,int nom)
{
while((str[nom]!=',')&&(str[nom]!=';')&&(str[nom]!='\0')) nom++;
if((str[nom]==';')||(str[nom]=='\0')) return 0;
return(++nom);
}
 
/*
*функция conv_string() позволяет конвертировать
*переданные ей параметры из текстового вида в целочисленные.
*входные параметры:
* str - параметр-строка
*выходные параметры:
* save_buffer - буфер интеджеров ,куда следует сохранить параметр(ы)
*
*возвращаемое значение - количество элементов, помещенных в буфер - НЕ БАЙТ!!!
*/
int conv_string(char *str,int *save_buffer)
{
int nom=0; /*номер следующего символа после запятой в строке-параметре*/
int count=0;
 
/*save first elem. from the string*/
if(sscanf(str,"%d,",&save_buffer[count])>0) count++;
 
while ((nom=get_parm_offset(str,nom))!=0)
sscanf(str+nom,"%d,",&save_buffer[count++]);
 
return count;
}
 
 
/*
*функция read_sec_parm() позволяет прочесть
*заданный параметр секции
*из заданного конфигурационного файла
*
*входные параметры:
* filename - имя файла
* sect_num - имя секции
* parm_name - имя параметра
*выходные:
* save_buffer - буфер,куда следует сохранить параметр
* save_size - его длина
*возвращаемое значение - код ошибки
*/
int read_sec_parm(char *filename,char *sect_name,char *parm_name,char *save_buffer,size_t save_size)
{
FILE *cfg_file; /*указатель на конфигурационный файл*/
char Order[4000]; /*имя секции*/
char buf[4000]; /*временный буфер строки из файла*/
int num_char=0;
 
memset(Order,' ',sizeof(Order));
 
/*открытие конфигурационного файла на чтение*/
cfg_file=fopen(filename,"r");
if(cfg_file==NULL) { perror("Cfg.c:fopen()");return -1; }
 
/*построчное сканирование файла*/
while(fgets(buf,sizeof(buf),cfg_file)!=NULL)
{
int i=0;
char ch=buf;/*временная переменная, в которую заносится символ*/
 
/*
*замеряется отступ от начала строки
*(количество символов пробелов+табуляций)
*/
while((ch==' ')||(ch=='\t')) ch=buf[++i];
 
/*
*если встретился символ коментариев или новая строка, то осуществляется
*переход на следующую строку
*/
if ((ch=='#')||(ch==';')||(ch=='\n')) continue;
 
/*нахождение секции*/
if(sscanf(buf+i,"[%s]",Order)!=0) continue;
 
/*если секция не наша то дальше продолжается сканирование*/
if (strncmp(sect_name,Order,strlen(sect_name))!=0) continue;
 
/*сравнение названий параметров*/
if (strncmp(parm_name,buf+i,strlen(parm_name))!=0) continue;
 
int j=i;/*номер последнего символа в строке*/
ch=buf[j];
 
/*символ ' ' является допустимым*/
while((ch!='\t')&&(ch!=';')&&(ch!='#')&&(ch!='\n')) ch=buf[++j];
num_char=j-(i+strlen(parm_name)+sizeof('='));
if(num_char>=save_size) {num_char=-1;break;}
strncpy(save_buffer,&buf[i+strlen(parm_name)+sizeof('=')],num_char);
save_buffer[num_char]=0;
 
break;
}
 
/*закрытие файла*/
fclose(cfg_file);
return num_char;
}
Конфигурационный файл состоит из секций, параметров и комментариев. Секция состоит из параметров. Секция начинается с новой строки и содержит заключенное между символами “[“ и “]” имя секции. Параметр начинается с новой строки и следует вслед за объявлением имени секции или другого параметра и состоит из названия параметра, после которого стоит символ “=” и значения, расположенного после символа “=”. Если параметр является перечисляемым, он состоит из нескольких разделенных символом “,” элементов. Комментарий начинается либо с новой строки, либо в продолжение текущей строки и состоит из символа “#” или “;” и последующего текста комментария. Наличие комментария является необязательным. В имени секции и имени параметра не допускаются символы пробела. В значении параметра допускаются символы пробела. В имени параметра недопускаются.
Пример
[имя_секции] ; текст комментария
имя_параметра=значение параметра
имя_параметра=значение параметра 1, значение араметра 2

А это пример реального файла конфигурации:

[tcp_device1]
#~ ip=192.168.2.2
#~ ip=192.168.253.15
ip=127.0.0.1
port=10002

[tcp_device2]
#~ ip=192.168.2.2
ip=127.0.0.1
port=10000

[Errors]
Err0=0
Err1=6,20,1,2,45,1,2,56,1,2,47,1,2,42






Вопрос забавный: как это грамотно запустить?

Для файла /home/user/TSH.config :

[parameters]
#describes the port we work on
port=1121
#describes the attacking DNS-host
dns=killerwhale.aq




____________________________

Точнее, как запустить функцию read_sec_parm (2 раза) чтобы получить эти два параметра в какие-нибудь переменные? Если точнее, для них нужно сделать #define.
Расскажите, пожалуйста, как можно подробнее. С объявлением переменных и т.п. После VB со строками тут тяжко..
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.11.2011, 21:24     Конфигурационный файл #4
Antisymmetrizer, какое отношение имеет тема, к разделу линукс программирования?
я вижу только отношение к разделу новичков.
Antisymmetrizer
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 22
28.11.2011, 21:35  [ТС]     Конфигурационный файл #5
Просто я сниффер под linux делаю, потому и написал сюда. Перенесите, если нужно, только скажите как запустить
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.11.2011, 21:44     Конфигурационный файл #6
в общем, вот, когда-то писал.
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
90
91
92
93
#include <string>
#include <fstream>
#include <algorithm>
#include <stdexcept>
 
/***************************************************************************/
 
struct config_file {
   struct variant {
      variant(const std::string& s)
         :str(s)
      {}
      /**  */
      template<typename T>
      T as() const {
         T result;
         std::stringstream ss(str);
         ss >> result;
         return result;
      }
      operator std::string () const { return str; }
   private:
      variant();
      std::string str;
   };
   /**  */
   config_file(const std::string& fn)
      :fname(fn)
   {
      std::ifstream file(fname);
      if ( !file ) {
         throw std::runtime_error("config file is not exists!");
      }
   }
   /**  */
   variant operator[] (const std::string& key) const {
      std::string temp, result;
      std::ifstream file(fname.c_str());
      if ( !file ) {
         throw std::invalid_argument("can`t open config file!");
      }
      while ( !file.eof() ) {
         std::getline(file, temp);
         if ( !temp.size() || temp[0] == '#' ) continue;
         if ( std::find(temp.begin(), temp.end(), '\r') != temp.end() ) {
            temp.erase(std::remove(temp.begin(), temp.end(), '\r'), temp.end());
         }
         if ( parse_string(result, key, temp) ) {
            break;
         }
      }
      if ( result.empty() ) {
         throw std::invalid_argument("value of string is empty for: " + key);
      }
      return result;
   }
private:
   bool parse_string(std::string& path, const std::string& key, const std::string& str) const {
      std::string::const_iterator it = std::search(str.begin(), str.end(), key.begin(), key.end());
      if ( it == str.end() ) return false;
 
      std::advance(it, key.length());
 
      while ( *it++ != '=' ) {}
      while ( *++it == ' ' ) {}
 
      path.assign(it, str.end());
#ifndef WIN32
      if ( path[0] == '~' ) {
         path.erase(path.begin());
         path = getenv("HOME") + path;
      }
#endif
      return true;
   }
 
private:
   std::string fname;
};
 
/***************************************************************************/
 
int main() {
   try {
      config_file config("myconfig.conf");
      int iv = config["key_name"].as<int>();
      std::string sv = config["some_key_name"];
   } catch ( const std::exception& ex ) {
      // work with ex
   }
}
 
/***************************************************************************/
и в раздел новичков.

Добавлено через 5 минут
ах да. конфиг.файл должен соответствовать .conf синтаксису:
key_name=1234
some_key_name=some string
Antisymmetrizer
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 22
28.11.2011, 22:06  [ТС]     Конфигурационный файл #7
Спасибо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2013, 13:31     Конфигурационный файл
Еще ссылки по теме:

Даны натуральное , символьный файл и текстовый файл . Файл содержит 30 слов , каждое из которых будем называть ключевым C++
Дан целочисленный файл А. Записать в файл В все кратные трём числа из А C++
C++ Задан текстовый файл, необходимо по нему сформировать двоичный файл индексов

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

Или воспользуйтесь поиском по форуму:
masuhorukov
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 3
02.08.2013, 13:31     Конфигурационный файл #8
C++
1
2
3
#include <Windows.h>
 
GetPrivateProfileString("имя секции", "имя ключа", "строка по дефолту", out_string, "c:\config.ini");
есть еще похожая функция для записи
Yandex
Объявления
02.08.2013, 13:31     Конфигурационный файл
Ответ Создать тему
Опции темы

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