powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / А как проверить наличие ключа (а не значение) в ini-файле?
10 сообщений из 10, страница 1 из 1
А как проверить наличие ключа (а не значение) в ini-файле?
    #38606283
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C-шная прога для определения булевых параметров (ДА/ НЕТ) использует принцип:
Код: plaintext
1.
  if (args.HasOption("value"))



По имеющейся логике для true сохраняется:
value -DWORD=1 -если реестр
value=true - если ini-файл
(если сохранять родными механизмами библиотеки ptlib)

Для false -параметр просто стирается.

Но в принципе ей пофиг. Если написать в ini:
value=0
value=false
value=
то HasOption будет все равно true, все параметры считываются в аргументы и проверяется наличие а не значение.

Я правлю ini независимой программой.
Для bool по своей логике я обычно использую
value=0 //false
value=1 //true

Ну и достаю (для отображения в настройщике) по принципу:
Код: vbnet
1.
value = CBool(GetPrivateProfileInt("Section", "value", 0, path_IniFile)) 'код VB не суть



Соответственно если написано (ну мало ли, умник залез и ручками исправил)
value=0
то
приложение args.HasOption("value") решит что TRUE
а настройщик покажет что CBool(0) = FALSE

непорядок

Отсюда вопрос:
Как вычислить НАЛИЧИЕ параметра в заданной секции?

Поиском пока нарыл, что в паскале есть ф-ция
INI.ValueExists()
Но Паскаль меня мало интересует, а в API я такой ф-ции явно не вижу.
Открывать INI как текстовуху и искать в лоб -честно бы не хотелось.
...
Рейтинг: 0 / 0
А как проверить наличие ключа (а не значение) в ini-файле?
    #38606294
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если только на базе этого:

GetPrivateProfileString function

If lpKeyName is NULL, the function copies all key names in the specified section to the supplied buffer. An application can use this method to enumerate all of the ...keys ... each string is followed by a null character and the final string is followed by a second null character. If the supplied destination buffer is too small to hold all the strings, the last string is truncated and followed by two null characters.

Код: vbnet
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.
Public Declare Function GetPrivateProfileString Lib "kernel32" Alias _
 "GetPrivateProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As Any, _
 ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, _
 ByVal lpFileName As String) As Long

Public Function IniKeyExists(Section As String, Key As String, FileName As String) As Boolean

  Dim RetVal As String, v As Long
  Dim retLen As Long
    
  Do
    retLen = retLen + 260 ' arbitrary - can be set higher/lower if desired
    RetVal = Space(retLen)
    v = GetPrivateProfileString(Section, CLng(0), "", RetVal, retLen, FileName)
  Loop Until v < retLen - 2
  ' v = 258 -if buffer is too small -> followed by two null characters (nSize minus two)
    
  'RetVal structure:
  'key1\0
  'key2\0
  '....
  'keyN\0\0
    
    If InStr(Chr(0) & RetVal, Chr(0) & Key & Chr(0)) > 0 Then IniKeyExists = True
End Function

value = IniKeyExists("Options", "value", path_IniFile)
...
Рейтинг: 0 / 0
А как проверить наличие ключа (а не значение) в ini-файле?
    #38606399
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RTFM GetPrivateProfileString()
If the key does not exist, the function copies the default character string
specified by the lpDefault parameter.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А как проверить наличие ключа (а не значение) в ini-файле?
    #38606422
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovRTFM GetPrivateProfileString()
If the key does not exist, the function copies the default character string
specified by the lpDefault parameter.


А идея в чем?
Предлагаешь впихнуть в lpDefault "Какая-нибудь редкостная билиберда", и если она окажется в буфере, то значит ключа нет.

А как насчет?
value=Какая-нибудь редкостная билиберда //=lpDefault
?
...
Рейтинг: 0 / 0
А как проверить наличие ключа (а не значение) в ini-файле?
    #38606425
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А как насчет?
Я не понял: ты читаешь ini-файл сформированный другой программой или безумным
пользователем?.. Запихни в Defaul свежесгенерированный GUID.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А как проверить наличие ключа (а не значение) в ini-файле?
    #38606426
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
документацию читать, а не курить нужно.
MSDN GetPrivateProfileStringlpKeyName [in]
The name of the key whose associated string is to be retrieved. If this parameter is NULL, all key names in the section specified by the lpAppName parameter are copied to the buffer specified by the lpReturnedString parameter.
...
Рейтинг: 0 / 0
А как проверить наличие ключа (а не значение) в ini-файле?
    #38606429
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77По имеющейся логике для true сохраняется:
value=true - если ini-файл
(если сохранять родными механизмами библиотеки ptlib)

Для false -параметр просто стирается.
Перебирать все ключи только для того, чтобы отличить "true" от всего остального, включая
lpDefault это по-нашему, по-советски.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А как проверить наличие ключа (а не значение) в ini-файле?
    #38606493
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилдокументацию читать, а не курить нужно.
А я разве не тоже самое во втором посте сверху написал?
Там и код готовый.
Ну, да, по документации это единственное что можно сделать.

Dimitry Sibiryakov,
ну можно конечно и GUID, но список ключей в секции и есть ли там нужный - вряд ли это долго.
Думаю GetPrivateProfileString делает это за один проход.

>Я не понял: ты читаешь ini-файл сформированный другой программой или безумным
пользователем?..
Да ini то формируется той же VB-мордой что и читает его.
Но любителей залесть в ini и вместо
value=1
попытаться написать
value=0
вполне хватает.

Просто не совсем обычный способ восприятия C-шной прогой. И не менять же этот код только потому что я захотел использовать ini вместо реестра.
...
Рейтинг: 0 / 0
А как проверить наличие ключа (а не значение) в ini-файле?
    #38606495
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Просто не совсем обычный способ восприятия C-шной прогой.
Поскольку функция HasOption() - нестандартная, тебе лучше найти в этой проге её исходники
и посмотреть как они сделаны.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А как проверить наличие ключа (а не значение) в ini-файле?
    #38606499
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Код: plaintext
1.
2.
3.
4.
5.
    /** Get if option present.
      Determines whether the option was specified on the command line.

PINLINE PBoolean PArgList::HasOption(const PString & option) const
  { return GetOptionCount(option) != 0; }



Там все прозрачно. Там без вопросов.
proga.exe --option1 --option2 value 2 --option3

Есть параметр в командной строке - значит HasOption(option1)=true

просто оно умеет читать из разных источников:
1) command line
2) registry
3) ini
4 либо конфиг файл в линуксе и т.п.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / А как проверить наличие ключа (а не значение) в ini-файле?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]