Трабл с TIniFile
Например есть возможность получить список секторов как лист, например:
-----
#include <inifiles.hpp>
TIniFile *ini = new TIniFile("ini.ini");
TStringList *str = new TStringList;
ini->ReadSections(str);
-----
Но проблема в том что секций очень и очень много и TStringList просто переполняется и записывает не все имена секций. А мне нужно просто считать один парметр всех секций, например:
[1]
пар№1=
пар№2=
пар№3=значение
[2]
пар№1=
пар№2=
пар№3=значение
[4]
пар№1=
пар№2=
пар№3=значение
[3]
пар№1=
пар№2=
пар№3=значение
...
нужно считать значение третьего парметра.. где его имя во всех секциях одинаково..
и так тысячи секций, причём не 1,2.. а может быть понаписано всё что угодно. А памяти чтобы получить их список не хватает. Может быть ещё способ получить не список а просто переходить от одной секции к другой? [1]->[2]->[4]->[3]
не запоминая их список в TStringList ?
Пожалуйста что нибуть посоветуйте..
Я перерыл справочники и не нашёл нужного метода в TIniFile..
Например есть возможность получить список секторов как лист, например:
-----
#include <inifiles.hpp>
TIniFile *ini = new TIniFile("ini.ini");
TStringList *str = new TStringList;
ini->ReadSections(str);
-----
Но проблема в том что секций очень и очень много и TStringList просто переполняется и записывает не все имена секций. А мне нужно просто считать один парметр всех секций, например:
[1]
пар№1=
пар№2=
пар№3=значение
[2]
пар№1=
пар№2=
пар№3=значение
[4]
пар№1=
пар№2=
пар№3=значение
[3]
пар№1=
пар№2=
пар№3=значение
...
нужно считать значение третьего парметра.. где его имя во всех секциях одинаково..
и так тысячи секций, причём не 1,2.. а может быть понаписано всё что угодно. А памяти чтобы получить их список не хватает. Может быть ещё способ получить не список а просто переходить от одной секции к другой? [1]->[2]->[4]->[3]
не запоминая их список в TStringList ?
Пожалуйста что нибуть посоветуйте..
А как ты определяешь, что список пререполняется?
Можно конечно открыть файл, искать строки , начинающиеся с "[", из них узнавать имена секций и дальше считывать значение параметра GetPrivateProfileInt или GetPrivateProfileString .
- Это не сложно определить так как конечные секции оставались не тронутыми. Потом я решил проверить и сбросил содержиоме в файл и тут и вышло что не до конца. Я порыл справочник, помудился и всё равно эту проблему не разрешил.
> Можно конечно открыть файл, искать строки, начинающиеся с "[", из них узнавать имена секций
- Это ну просто супер как медленно будет, а у меня тысячи секций!
> А как ты определяешь, что список пререполняется?
- Это не сложно определить так как конечные секции оставались не тронутыми. Потом я решил проверить и сбросил содержиоме в файл и тут и вышло что не до конца. Я порыл справочник, помудился и всё равно эту проблему не разрешил.
> Можно конечно открыть файл, искать строки, начинающиеся с "[", из них узнавать имена секций
- Это ну просто супер как медленно будет, а у меня тысячи секций!
попробуй через АПИ
DWORD GetPrivateProfileSectionNames(
LPTSTR lpszReturnBuffer, // address of return buffer
DWORD nSize, // size of return buffer
LPCTSTR lpFileName // address of initialization filename
);
записывается только имя первой секции!
---
char buffer[100];
GetPrivateProfileSectionNames(buffer, sizeof(buffer)-1, "C:\\ini.ini");
Memo1->Text = buffer;
---
что тут не так?
vector<string>& v
что это значит?
А то мне не удоётся получить список:
IniProfile *ini;
ini->GetSectionNames(???);
Спасибо за совет, но у меня почему то не выходит..
записывается только имя первой секции!
---
char buffer[100];
GetPrivateProfileSectionNames(buffer, sizeof(buffer)-1, "C:\\ini.ini");
Memo1->Text = buffer;
---
что тут не так?
Гы-Гы...
Все так.
Прикинь сам, в чем ты ошибся?
А поможет тебе в этом брэйкпоинт на строке "Memo1->Text = buffer;" и тут ты посмотри чему будет равен твой буфер
:D
Это же АПИ и каждая строка заканчивается /0, а буфер - это не строка, а какбы массив строк каждая из которых заканчивается /0, но ведь Memo этого не знает :D !!!
Поэтому у тебя только одна секция записана, хотя все они там есть...
- Это ну просто супер как медленно будет, а у меня тысячи секций!
Если данных так много, лучше будет использовать собственный формат файла, возможно, двоичный или на основе XML, что лучше.
Большое спасибо! но я не могу понять...
vector<string>& v
что это значит?
А то мне не удоётся получить список:
IniProfile *ini;
ini->GetSectionNames(???);
В метод GetSectionNames передаётся по ссылке (&) параметр - строковый контейнер (vector<string>), куда будут помещены названия секций.