Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/75: Рейтинг темы: голосов - 75, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 22

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

28.11.2011, 19:27. Показов 14773. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
В общем, стоит задача в мою программу добавить конфигурационный файл. Пока необходимо считать из него два параметра:
1) №порта
2) dns-имя сервера
Соответственно, первый параметр число, второй- строка (или указатель на char?).

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

P.S. не могу я нормально понять работу со строками в С++
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2011, 19:27
Ответы с готовыми решениями:

Конфигурационный файл
Подскажите что нужно прописать в конфиг файле S1 чтобы был доступ к www1.www2.www3

Конфигурационный файл
Всем привет! Вопрос такой Необходимо реализовать работу с конфигурационным файлом Допустим, в нём хранятся некие данные Но...

Конфигурационный файл
Привет всем! Решил к проекту прикрутить конфигурационный файл. Возле .exe файла разместил файл ixvMyCabinet.config и пытаюсь из него...

7
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.11.2011, 20:45
вопросы где?

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

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 со строками тут тяжко..
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.11.2011, 21:24
Antisymmetrizer, какое отношение имеет тема, к разделу линукс программирования?
я вижу только отношение к разделу новичков.
0
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 22
28.11.2011, 21:35  [ТС]
Просто я сниффер под linux делаю, потому и написал сюда. Перенесите, если нужно, только скажите как запустить
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.11.2011, 21:44
в общем, вот, когда-то писал.
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
0
1 / 1 / 0
Регистрация: 10.05.2010
Сообщений: 22
28.11.2011, 22:06  [ТС]
Спасибо!
0
0 / 0 / 1
Регистрация: 02.08.2013
Сообщений: 3
02.08.2013, 13:31
C++
1
2
3
#include <Windows.h>
 
GetPrivateProfileString("имя секции", "имя ключа", "строка по дефолту", out_string, "c:\config.ini");
есть еще похожая функция для записи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2013, 13:31
Помогаю со студенческими работами здесь

Перечитать конфигурационный файл
Изменил конфигурационный файл, пытаюсь его перечитать, но получаю сообщение об ошибке systemctl reload sv-contacts.service Failed to...

Qt конфигурационный файл защитить
Всем привет! В программе использую конфигурационный файл. Данные в формате json. Хочу зашифровать файл с расширение *.json. В Qt нету...

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

Конфигурационный файл Route
Добрый день, подскажите как исправить следующую ошибку Строка не распознана как действительное логическое значение. Описание:...

Испорченный конфигурационный файл
Сначала phpmyadmin у меня запускался. Теперь выдает ошибку 403. Я думаю, что-то удалила в конфигурационном файле apache2.conf, потому...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru