Компонент для работы с ini-файлом
От: Попов Юрий Юрьевич Россия http://spbdetails.ru
Дата: 09.10.03 06:36
Оценка: 145 (5) +1 -1
Статья:
Компонент для работы с ini-файлом
Автор(ы): Попов Юрий Юрьевич
Дата: 23.09.2003
При разработке одной из программ я столкнулся с совершенно типовой проблемой: было необходимо использовать ini-файл для хранения конфигурационных данных программы. Задача стандартная, но в моем случае данные были совершенно разных типов (целые числа, числа с плавающей точкой, строки, цвет в кодировке RGB). Каждый из параметров должен был удовлетворять определенным ограниченям. Подходящих решений под рукой не оказалось, в связи с чем на свет появился этот компонент.


Авторы:
Попов Юрий Юрьевич

Аннотация:
При разработке одной из программ я столкнулся с совершенно типовой проблемой: было необходимо использовать ini-файл для хранения конфигурационных данных программы. Задача стандартная, но в моем случае данные были совершенно разных типов (целые числа, числа с плавающей точкой, строки, цвет в кодировке RGB). Каждый из параметров должен был удовлетворять определенным ограниченям. Подходящих решений под рукой не оказалось, в связи с чем на свет появился этот компонент.
Take it easy.
Re: Компонент для работы с ini-файлом
От: hard.disk  
Дата: 09.10.03 07:51
Оценка:
Здравствуйте, Попов Юрий Юрьевич, Вы писали:

ПЮЮ>Статья:



ПЮЮ>Авторы:

ПЮЮ> Попов Юрий Юрьевич

ПЮЮ>Аннотация:

ПЮЮ>При разработке одной из программ я столкнулся с совершенно типовой проблемой: было необходимо использовать ini-файл для хранения конфигурационных данных программы. Задача стандартная, но в моем случае данные были совершенно разных типов (целые числа, числа с плавающей точкой, строки, цвет в кодировке RGB). Каждый из параметров должен был удовлетворять определенным ограниченям. Подходящих решений под рукой не оказалось, в связи с чем на свет появился этот компонент.

А это не устраивает:
GetPrivateProfileInt
GetPrivateProfileSection
GetPrivateProfileSectionNames
GetPrivateProfileString
GetPrivateProfileStruct
GetProfileInt
GetProfileSection
GetProfileString
WritePrivateProfileSection
WritePrivateProfileString
WritePrivateProfileStruct
WriteProfileSection
WriteProfileString

Правда только под Windows
Re: Компонент для работы с ini-файлом
От: kolam http://www.linkedin.com/in/kolam
Дата: 09.10.03 08:32
Оценка:
Здравствуйте, Попов Юрий Юрьевич, Вы писали:

ПЮЮ>При разработке одной из программ я столкнулся с совершенно типовой проблемой: было необходимо использовать ini-файл для хранения конфигурационных данных программы.

По-моему, если программа разрабатывалась под Windows, легче было записать конфигурацию в XML, используя msxml.
kolam
Re[2]: Компонент для работы с ini-файлом
От: Рома Мик Россия http://romamik.com
Дата: 09.10.03 10:40
Оценка:
Здравствуйте, kolam, Вы писали:

K>Здравствуйте, Попов Юрий Юрьевич, Вы писали:


ПЮЮ>>При разработке одной из программ я столкнулся с совершенно типовой проблемой: было необходимо использовать ini-файл для хранения конфигурационных данных программы.

K>По-моему, если программа разрабатывалась под Windows, легче было записать конфигурацию в XML, используя msxml.
Возможно я ошибаюсь, но msxml под 95 винды не ставится. По крайней мере последний.
... << RSDN@Home 1.1 beta 2 >>
Re[3]: Компонент для работы с ini-файлом
От: kolam http://www.linkedin.com/in/kolam
Дата: 09.10.03 11:09
Оценка:
Здравствуйте, Рома Мик, Вы писали:

РМ>Возможно я ошибаюсь, но msxml под 95 винды не ставится. По крайней мере последний.

msxml.dll входит в состав Internet Explorer 5.0 for Win95. И даже в состав IE 4.0 for Win95, но на этот счет я не уверен.
kolam
Re[2]: Компонент для работы с ini-файлом
От: Yuri Россия http://spbdetails.ru
Дата: 09.10.03 12:29
Оценка:
Здравствуйте, hard.disk, Вы писали:

HD>А это не устраивает:

HD>GetPrivateProfileInt
HD>GetPrivateProfileSection
HD>GetPrivateProfileSectionNames
HD>GetPrivateProfileString
HD>GetPrivateProfileStruct
HD>GetProfileInt
HD>GetProfileSection
HD>GetProfileString
HD>WritePrivateProfileSection
HD>WritePrivateProfileString
HD>WritePrivateProfileStruct
HD>WriteProfileSection
HD>WriteProfileString

HD>Правда только под Windows


Нет, не устраивает, хотелось иметь более удобный и гибкий инструмент.
Take it easy.
Re[4]: Компонент для работы с ini-файлом
От: Рома Мик Россия http://romamik.com
Дата: 09.10.03 16:03
Оценка: 2 (1)
Здравствуйте, kolam, Вы писали:

K>Здравствуйте, Рома Мик, Вы писали:


РМ>>Возможно я ошибаюсь, но msxml под 95 винды не ставится. По крайней мере последний.

K>msxml.dll входит в состав Internet Explorer 5.0 for Win95. И даже в состав IE 4.0 for Win95, но на этот счет я не уверен.
По собственному опыту скажу: еще много где сохранились win95, на многих из них не стоят никакие апдейты, включая свежий эксплорер. У меня лично копирование msxml.dll в голую винду не привело к тому, что програма с использованием msxml заработала. Всякие regsvr32 тоже не помогли. Хотя я не очень и пытался. Просто решил, что msxml в программах, рассчитанных на максимальную переносимость лучше не использовать.
... << RSDN@Home 1.1 beta 2 >>
Re[3]: Компонент для работы с ini-файлом
От: hard.disk  
Дата: 10.10.03 06:07
Оценка: +1
Здравствуйте, Yuri, Вы писали:

Y>Здравствуйте, hard.disk, Вы писали:


HD>>А это не устраивает:

HD>>GetPrivateProfileInt
HD>>GetPrivateProfileSection
HD>>GetPrivateProfileSectionNames
HD>>GetPrivateProfileString
HD>>GetPrivateProfileStruct
HD>>GetProfileInt
HD>>GetProfileSection
HD>>GetProfileString
HD>>WritePrivateProfileSection
HD>>WritePrivateProfileString
HD>>WritePrivateProfileStruct
HD>>WriteProfileSection
HD>>WriteProfileString

HD>>Правда только под Windows


Y>Нет, не устраивает, хотелось иметь более удобный и гибкий инструмент.


Тогда можно было использовать эти функции в реализации, а не изобретать, IMHO, свой парсер,
т.е. сделать обёртку.
Re[4]: Компонент для работы с ini-файлом
От: Hacker_Delphi Россия  
Дата: 10.10.03 11:06
Оценка:
Здравствуйте, hard.disk, Вы писали:

HD>Тогда можно было использовать эти функции в реализации, а не изобретать, IMHO, свой парсер,

HD>т.е. сделать обёртку.
Гы... только у этих функций на 9x есть принципиальное ограничение — размер файла МЕНЬШЕ 64 Кб... а на NT — нету... по крайней мере, эксперимент показал, что все именно так...
... << RSDN@Home 1.1 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[5]: Компонент для работы с ini-файлом
От: hard.disk  
Дата: 10.10.03 12:22
Оценка: -4
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>Здравствуйте, hard.disk, Вы писали:


HD>>Тогда можно было использовать эти функции в реализации, а не изобретать, IMHO, свой парсер,

HD>>т.е. сделать обёртку.
H_D>Гы... только у этих функций на 9x есть принципиальное ограничение — размер файла МЕНЬШЕ 64 Кб... а на NT — нету... по крайней мере, эксперимент показал, что все именно так...

Мне кажется уже не стоит орентироватся на линейку Windows 9x.
Да и всегда есть выход:

1) Разбить файл на логические секции:
settings1.ini — настройки интерфейса
settings2.ini — настройки связанные с обработкой данных

2) Вынести большие значения в отдельный файл:
[SomeSection]
SomeBigValueKey=SomeBigValueOfKey.bin

Я думаю это лучше, чем тащить код который есть в системе.
Re[6]: Компонент для работы с ini-файлом
От: Рома Мик Россия http://romamik.com
Дата: 10.10.03 13:01
Оценка: +1
Здравствуйте, hard.disk, Вы писали:

HD>Мне кажется уже не стоит орентироватся на линейку Windows 9x.

Гм. Попробуйте написать какой-нибудь софт для Сбербанка.

HD>Да и всегда есть выход:

HD>1) Разбить файл на логические секции:
HD>settings1.ini — настройки интерфейса
HD>settings2.ini — настройки связанные с обработкой данных
Ух, крысота.

HD>2) Вынести большие значения в отдельный файл:

HD>[SomeSection]
HD>SomeBigValueKey=SomeBigValueOfKey.bin
Можно и так, но удобнее все настройки все-таки в месте.

HD>Я думаю это лучше, чем тащить код который есть в системе.

Да сколько там его, кода-то?
... << RSDN@Home 1.1 beta 2 >>
Re[6]: Компонент для работы с ini-файлом
От: HeaveN Россия  
Дата: 10.10.03 15:53
Оценка: +2
Здравствуйте, hard.disk, Вы писали:


HD>Мне кажется уже не стоит орентироватся на линейку Windows 9x.


Пока эта ось стоит у на большем количестве десктопов, на нее надо ориентироваться.
... << RSDN@Home 1.1 beta 2 >>
Нет такого закона, что человеку летать нельзя...
Re: Компонент для работы с ini-файлом
От: Аноним  
Дата: 14.10.03 14:33
Оценка: 9 (1)
Здравствуйте, Попов Юрий Юрьевич,:

Вопрос по дизайну. Некоторые решения мне показались сомнительными, однако, полагаю, они вызваны определенными причинами. Мне интересно почему ты именно так спроектировал свою библиотеку.

1. Насколько я понял исключения бросаются как указатели. т.е. для того, чтобы словить его, я должен написать так:
try {
     // . . .
}
catch(CException *exc) {
     // обработка ошибки
     exc->Delete(); // явное удаление объекта-исключения
}


Вместе с тем, класс CException наследуется от std::exception. На мой взгляд, здесь присутствует непоследовательность, поскольку исключения стандартной библиотеки бросаются по значению. Лично я, либо не наследовал бы CException от std::exception, либо бросал исключения по значению. Кстати, во втором случае не нужно было бы делать явное удаление исключения и можно было бы словить данное исключение таким catch-блоком, которое ловит также и исключения стандартной библиотеки:
try {
     // . . .
}
catch(const std::exception &exc) {
     // обработка ошибки
}


2. Класс исключения один. Однако IniParser возбуждает исключения различных видов, и эти виды исключений различаются кодами ошибок, которые можно получить вызовом CException::GetCode(). Мне кажется, что лучше было бы сделать несколько классов исключений (например, CFileSystemException, CValueOutOfRangesException), имеющих общего предка (тот же CException). В этом случае появилась бы возможность ловить специфические виды исключений и по своему их обрабатывать.

И, кстати, не нужно было бы в исключении вида FileSystemError использовать поле CException::m_nLineNum для передачи кода ошибки.

--
Дмитрий
Re: Компонент для работы с ini-файлом
От: Аноним  
Дата: 07.08.06 08:00
Оценка:
Здравствуйте, Попов Юрий Юрьевич:

Если в примере вырезать
pars.ParseFile("test.ini");


то сохранение в файл не работает
К сведению...
От: Closer  
Дата: 08.08.06 09:05
Оценка: 11 (2)
Есть такой проект http://nini.sourceforge.net/
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Мы были здесь. Но пора идти дальше. (с) Дуглас Коупленд, Рабы "Микрософт"
Re[7]: Компонент для работы с ini-файлом
От: Олег Гашев
Дата: 10.09.06 19:33
Оценка:
Здравствуйте, HeaveN, Вы писали:

HN>Здравствуйте, hard.disk, Вы писали:



HD>>Мне кажется уже не стоит орентироватся на линейку Windows 9x.


HN>Пока эта ось стоит у на большем количестве десктопов, на нее надо ориентироваться.


На 5% у online пользователей Win98. Win95 ~1%. Это очень мало.
Либо я найду путь, либо проложу его. © Свифт
Re[8]: Компонент для работы с ini-файлом
От: Plague Россия 177230800
Дата: 11.09.06 07:44
Оценка:
ОГ>На 5% у online пользователей Win98. Win95 ~1%. Это очень мало.
А реально глянуть где-нить статистику? К примеру, по какому-нить сайту, где не только программисты, а есть простые обыватели?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: Компонент для работы с ini-файлом
От: Олег Гашев
Дата: 11.09.06 15:05
Оценка:
Здравствуйте, Plague, Вы писали:

ОГ>>На 5% у online пользователей Win98. Win95 ~1%. Это очень мало.

P>А реально глянуть где-нить статистику? К примеру, по какому-нить сайту, где не только программисты, а есть простые обыватели?

http://www.thecounter.com/stats/2006/September/os.php
Либо я найду путь, либо проложу его. © Свифт
Re[8]: Компонент для работы с ini-файлом
От: Towiz Украина  
Дата: 27.10.06 18:02
Оценка:
Здравствуйте, Олег Гашев, Вы писали:

HD>>>Мне кажется уже не стоит орентироватся на линейку Windows 9x.


HN>>Пока эта ось стоит у на большем количестве десктопов, на нее надо ориентироваться.


ОГ>На 5% у online пользователей Win98. Win95 ~1%. Это очень мало.


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