Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 10

GetPrivateProfileString не выводит все ключи

05.05.2014, 14:46. Показов 5375. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Мучаюсь уже несколько дней, так и не пойму в чем загвоздка.

Вообщем есть WinApi функция GetPrivateProfileString :
C++
1
2
3
4
5
6
7
8
DWORD WINAPI GetPrivateProfileString(
__in LPCTSTR lpAppName,
__in LPCTSTR lpKeyName,
__in LPCTSTR lpDefault,
__out LPTSTR lpReturnedString,
__in DWORD nSize,
__in LPCTSTR lpFileName
);
Где:

lpAppName — имя секции, в которой находится считываемй ключ. Если в качестве этого параметра передать NULL, функция вернет список всех секций в указанном INI-файле
lpKeyName — имя ключа, чье значение нужно считать. Если в качестве параметра передать NULL, то функция, по аналогии с секциями, вернет имена всех ключей в секции.
lpDefault — строка по умолчанию. Если в указанном INI-файле ключ lpKeyName не найден, то функция вернет это значение.
lpReturnedString — буфер, в который будут записаны возвращаемые функцией данные
lpFileName — имя считываемого INI-файла.

То есть код типа :
C++
1
GetPrivateProfileStringA("Section", NULL, NULL, out, 200, (LPCSTR)".\\inifile.ini");
должен вывести в переменную out список всех ключей в данной секции, но у меня выводит только первый ключ.

Вот мой код (Visual Studio C++):
C++
1
2
3
4
5
char* out = new char[4096];
String^ outStr;
GetPrivateProfileStringA("Section", NULL, NULL, out, 200, (LPCSTR)".\\inifile.ini");
richTextBox1->Text = gcnew String(out);
treeView1->Nodes->Add(gcnew System::String(out));
То же самое если задать вывод всех секций, то выводит только первую из файла.
Но количество символов считает правильно.

Спасибо за помощь.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.05.2014, 14:46
Ответы с готовыми решениями:

Как узнать все внешние ключи таблицы
Добрый вечер. Помогите пожалуйста, как запросом узнать все внешние ключи таблицы? помогите пожалуйста.

GetPrivateProfileString
Не получается прочитать файл #include<windows.h> #include<iostream> using namespace std; int main() { CHAR a; ...

Ключи, ключи, ключики. нужен совет
Дорого времени суток. Народ помогите пожалуйста разобраться с проблемой ключей в 1С 8.3.6.2237. Рассказываю ситуевину: Короче у нас...

10
 Аватар для oxyfat
68 / 65 / 21
Регистрация: 01.05.2014
Сообщений: 247
05.05.2014, 16:19
Приветствую!
Ваш код немного не изящен. Плюс нужно указать имя переменной, а так вы получаете только первую строку секции.
Конечно, следует отталкиваться от типа переменной - которую желаете получить.
Не так давно, я "обернул" два класса: Чтение и Запись в *.INI файл.
- выдержка-пример (при желании, вложение zip):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// ...
 
    /* Инициализировать имя файла *.INI: */
    GIniRead.SetFilename(m_sIniFilename); // Здесь - m_sIniFilename - это: CString
    GIniWrite.SetFilename(m_sIniFilename);
 
    /* Счётчик запуска программы: */
    BOOL bRunCount=0x0FFFFFFFF;
    bRunCount=GIniRead.GetInteger(TEXT("Counter"),TEXT("RunCount"),FALSE);
    ++bRunCount;
    GIniWrite.WriteInteger(TEXT("Counter"),TEXT("RunCount"),bRunCount);
 
    /* Получить позицию окна: */
    m_sWinPos=GIniRead.GetString(TEXT("Setting"),TEXT("Position"),TEXT(""));
 
//...
Следующее, код класса: "GIniRead"
Кликните здесь для просмотра всего текста

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
#include "stdafx.h"
#include "IniRead.h"
 
/////////////////////////////////////////////////////////////////////////////
// SetFilename
 
void IniRead::SetFilename(const TCHAR* Filename)
{
    m_Filename=Filename;
}
 
IniRead GIniRead;
 
/////////////////////////////////////////////////////////////////////////////
// GetInteger
 
int IniRead::GetInteger(const TCHAR* Section,const TCHAR* Name,int Value)
{
    return GetPrivateProfileInt(Section,Name,Value,m_Filename);
}
 
/////////////////////////////////////////////////////////////////////////////
// GetFloat
 
float IniRead::GetFloat(const TCHAR* Section,const TCHAR* Name,float Value)
{
    const TCHAR* Default;
    const DWORD MaxLen=256;
    TCHAR Buffer[MaxLen];
    wsprintf(Buffer,TEXT("%f"),Value);
    Default=Buffer;
    Buffer[MaxLen]='\0';
    GetPrivateProfileString(Section,Name,Default,Buffer,MaxLen,m_Filename);
    float fltResult;
    double dd;
    dd=atof(Buffer);
    fltResult=(float)dd;
    return fltResult;
}
 
BOOL IniRead::GetBoolean(const TCHAR* Section,const TCHAR* Name,BOOL Value)
{
    BOOL Result;
    const TCHAR* Default;
    const DWORD MaxLen=256;
    TCHAR Buffer[MaxLen];
    wsprintf(Buffer,TEXT("%s"),Value ? "True" : "False");
    Default=Buffer;
    Buffer[MaxLen]='\0';
    GetPrivateProfileString(Section,Name,Default,Buffer,MaxLen,m_Filename);
    Result=(lstrcmp(Buffer,TEXT("True"))==0||lstrcmp(Buffer,TEXT("true"))==0) ? true : false;
    return Result;
}
 
/////////////////////////////////////////////////////////////////////////////
// GetString
 
const TCHAR* IniRead::GetString(const TCHAR* Section,const TCHAR* Name,const TCHAR* Value)
{
    const DWORD MaxLen=256;
    static TCHAR Result[MaxLen]=TEXT("");;
    GetPrivateProfileString(Section,Name,Value,Result,MaxLen,m_Filename);
    return Result;
}
 
/////////////////////////////////////////////////////////////////////////////
// <<eof>> IniRead.cpp
/////////////////////////////////////////////////////////////////////////////


* Чтение / Запись "*.INI" файла: ReadIni.zip
0
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 10
05.05.2014, 17:02  [ТС]
Спасибо.
Я только начинаю заниматься VS C++ и приведенный Вами пример мне разобрать пока не под силу.
Вы написали
...Плюс нужно указать имя переменной, а так вы получаете только первую строку секции...
Где еще её необходимо указать?

Работая в RadStudio и читая описание компонентов, процедура работы с ini файлами прошла легко и быстро.
Я удивлен,что WinApi функция не выполняет функционал из своего же описания, и мой мозг отказывается это понять уже вторую неделю.

Неужели, чтобы вывести все ключи (или секции) из .ini файла необходим код в 71 строку?
0
 Аватар для oxyfat
68 / 65 / 21
Регистрация: 01.05.2014
Сообщений: 247
05.05.2014, 17:14
Зачем в Семьдесят Одну Строку - Обижаете...
"Хотел как лучше, а получилось как всегда..." - из какого-то Юмористического сюжета.
Согласен: "вам ленно" просмотреть код, тогда, вот:

-----------------------------------[ ваш код ]-----------------------------------------
char* out = new char[4096];
String^ outStr;
GetPrivateProfileStringA("Section", NULL, NULL, out, 200, (LPCSTR)".\\inifile.ini");
---------------------------------------| |
-----печатайте здесь Имя_Переменной
1
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 10
06.05.2014, 11:48  [ТС]
char* out = new char[4096];
String^ outStr;
GetPrivateProfileStringA("Section", NULL, NULL, out, 200, (LPCSTR)".\\inifile.ini");
---------------------------------------| |
-----печатайте здесь Имя_Переменной
Так?
C++
1
2
3
4
char* out = new char[4096];
DWORD iniF;
iniF = GetPrivateProfileStringA("Section", NULL, NULL, out, 200, (LPCSTR)".\\inifile.ini");
richTextBox1->Text = gcnew String(out); // Разве это не есть вывод переменной ?
И дело тут совсем не в лени. Мне действительно еще не хватает знаний, что бы прочесть Ваш код.
Но что то мне подсказывает, что такая вещь, как чтение .ini посредством WinApi реализуется в пару строк.
Судя по поиску в интернете, такое ощущение, что я один, кто столкнулся с данной проблемой.

Вот единственное, что нашел похожее, но решение там несколько абстрактно
Причина обнаружена, функция возвращает нужное количество символов. А вот отображение идёт неправильно. вывожу через объект wcout подскажите пожалуйста почему может быть неправильно
Вообщем проблему решил. ПРоблема была в том что объект wcout который должен выводить юникодовые строки, почему то не выводит нужный массив символов, а проблема решилась ручным посимвольным выводом через цикл.
Добавлено через 18 часов 5 минут
Неужели никто не сможет помочь?
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
07.05.2014, 13:28
6eH, функция GetPrivateProfileString предназначена для чтения одной строки секции:
Retrieves a string from the specified section in an initialization file.
...
The GetPrivateProfileString function searches the specified initialization file for a key that matches the name specified by the lpKeyName parameter under the section heading specified by the lpAppName parameter. If it finds the key, the function copies the corresponding string to the buffer. If the key does not exist, the function copies the default character string specified by the lpDefault parameter.
Для того, чтобы получить все ключи секции вы должны использовать функцию GetPrivateProfileSection и выбирать из списка нужные.
Возможно, также будет интересна функция GetPrivateProfileSectionNames.
1
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 10
07.05.2014, 17:53  [ТС]
GrayWolf предложенные Вами функции тоже выводили только первый результат, но Ваш ответ натолкнул меня на верное решение.
Вообщем был всего лишь необходим цикл перехода строки в буфере.
Выкладываю рабочий код (выводит все секции):
C++
1
2
3
4
5
6
7
8
char* out = new char[4096];
GetPrivateProfileStringA(NULL, NULL, NULL, out, 200, (LPCSTR)".\\inifile.ini");
treeView1->Nodes->Add(gcnew String(out));
while (*out != NULL) 
  {                                  
    out += strlen(out) + 1;                       // переход на следующую строку
    treeView1->Nodes->Add(gcnew String(out));    // Вывод
  }
А этот выводит все ключи в секции [Section]:
C++
1
2
3
4
5
6
7
8
char* out = new char[4096];
GetPrivateProfileStringA("Section", NULL, NULL, out, 200, (LPCSTR)".\\inifile.ini");
treeView1->Nodes->Add(gcnew String(out));
while (*out != NULL) 
  {                                  
    out += strlen(out) + 1;                       // переход на следующую строку
    treeView1->Nodes->Add(gcnew String(out));    // Вывод
  }
Спасибо oxyfat и GrayWolf!
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
07.05.2014, 19:01
Цитата Сообщение от 6eH Посмотреть сообщение
GrayWolf предложенные Вами функции тоже выводили только первый результат, но Ваш ответ натолкнул меня на верное решени
Предложенные мной функции выдавали список ключей, каждый пункт которого заканчивался нулевым символом, а последний пункт - двойным нулевым. После получения массива ключей требовалось лишь перебрать все его пункты и выбрать нужный.
Впрочем, каким бы ни было решение, главное было "пнуть" человека в нужном направлении
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
05.02.2017, 22:14
у меня выводит много мусора если выводить в секции Европа,ключ Турцию,да его его значение выведеться это Анкара и очень много мусора.
А если просто список всех ключей секции Европы то все ок и без мусора.Что делать?

Добавлено через 22 секунды
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
// test.cpp: определяет точку входа для консольного приложения.
//  
 
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "rus");
    char* out = new char[4096];
     
    GetPrivateProfileStringA(
    "Европа",//название секции
    "Греция",//название ключа
       NULL,//возврат значения если такого ключа нет
       out,//строка
       4096,//размер строки
       (LPCSTR)".\\test.ini");// адрес строки с именем ини файла в папке с программой
    while (*out != NULL)
    {                
        cout << out << endl;   // Вывод всех ключей секции "Европа"
        out += strlen(out) + 1; // переход на следующую строку
    }
    
    system("pause");
    return 0;
}
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
05.02.2017, 22:15
test.zip
это ини файл,я пробовал вместо 4096 ставить 2 и 3 все равно мусор.
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
06.02.2017, 03:28
1) Не используйте без крайней на то необходимости завершающие A и W в именах функций;
2) функция GetPrivateProfileString возвращает указатель на строку типа TCHAR, вы используете char* отсюда и ваш "мусор";
3) старайтесь использовать Unicode, времена ASCII давно ушли.
Используйте либо указатель на массив TCHAR, либо выполняйте преобразование из TCHAR в char.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.02.2017, 03:28
Помогаю со студенческими работами здесь

Бинарное дерево(увеличить все ключи дерева на число k)
Составить программу, увеличивающую все ключи дерева на число k

Узнать все ключи в реестре, которые создала программа
Возможно ли как - то сделать? Вот есть программа, я её установил, всё работает, хорошо. Слетела винда, поставил новую. Программа...

Не работает GetPrivateProfileString()
#include &lt;windows.h&gt; #include &lt;iostream&gt; #define CFG_FILE_NAME &quot;C:\\Users\Home\Documents\Visual Studio...

GetPrivateProfileString и буфер
Здравствуйте! Есть такой код: public string IniRead (string iniSec, string iniKey) // Функция чтения ini { ...

Непонятки с GetPrivateProfileString()
Привет, хочу прочитать с .ini некую информацию. Читаю так: LPTSTR str; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru