Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Трабл с TIniFile

1.9K
12 июля 2004 года
xiOn
78 / / 16.03.2004
Я перерыл справочники и не нашёл нужного метода в 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 ?
Пожалуйста что нибуть посоветуйте..
2.0K
12 июля 2004 года
Fazil6
126 / / 17.12.2003
Цитата:
Originally posted by xiOn
Я перерыл справочники и не нашёл нужного метода в 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 .

1.9K
12 июля 2004 года
xiOn
78 / / 16.03.2004
> А как ты определяешь, что список пререполняется?
- Это не сложно определить так как конечные секции оставались не тронутыми. Потом я решил проверить и сбросил содержиоме в файл и тут и вышло что не до конца. Я порыл справочник, помудился и всё равно эту проблему не разрешил.
> Можно конечно открыть файл, искать строки, начинающиеся с "[", из них узнавать имена секций
- Это ну просто супер как медленно будет, а у меня тысячи секций!
2.0K
12 июля 2004 года
Fazil6
126 / / 17.12.2003
Цитата:
Originally posted by xiOn
> А как ты определяешь, что список пререполняется?
- Это не сложно определить так как конечные секции оставались не тронутыми. Потом я решил проверить и сбросил содержиоме в файл и тут и вышло что не до конца. Я порыл справочник, помудился и всё равно эту проблему не разрешил.
> Можно конечно открыть файл, искать строки, начинающиеся с "[", из них узнавать имена секций
- Это ну просто супер как медленно будет, а у меня тысячи секций!



попробуй через АПИ

DWORD GetPrivateProfileSectionNames(
LPTSTR lpszReturnBuffer, // address of return buffer
DWORD nSize, // size of return buffer
LPCTSTR lpFileName // address of initialization filename
);

1.9K
12 июля 2004 года
xiOn
78 / / 16.03.2004
Спасибо за совет, но у меня почему то не выходит..
записывается только имя первой секции!
---
char buffer[100];
GetPrivateProfileSectionNames(buffer, sizeof(buffer)-1, "C:\\ini.ini");
Memo1->Text = buffer;
---
что тут не так?
310
13 июля 2004 года
fellow
853 / / 17.03.2003
Попробуйте мой класс для работы с INI
1.9K
13 июля 2004 года
xiOn
78 / / 16.03.2004
Большое спасибо! но я не могу понять...
vector<string>& v
что это значит?
А то мне не удоётся получить список:
IniProfile *ini;
ini->GetSectionNames(???);
2.0K
13 июля 2004 года
Fazil6
126 / / 17.12.2003
Цитата:
Originally posted by xiOn
Спасибо за совет, но у меня почему то не выходит..
записывается только имя первой секции!
---
char buffer[100];
GetPrivateProfileSectionNames(buffer, sizeof(buffer)-1, "C:\\ini.ini");
Memo1->Text = buffer;
---
что тут не так?



Гы-Гы...
Все так.
Прикинь сам, в чем ты ошибся?
А поможет тебе в этом брэйкпоинт на строке "Memo1->Text = buffer;" и тут ты посмотри чему будет равен твой буфер

:D

Это же АПИ и каждая строка заканчивается /0, а буфер - это не строка, а какбы массив строк каждая из которых заканчивается /0, но ведь Memo этого не знает :D !!!

Поэтому у тебя только одна секция записана, хотя все они там есть...

10
13 июля 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by xiOn
- Это ну просто супер как медленно будет, а у меня тысячи секций!


Если данных так много, лучше будет использовать собственный формат файла, возможно, двоичный или на основе XML, что лучше.

310
13 июля 2004 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by xiOn
Большое спасибо! но я не могу понять...
vector<string>& v
что это значит?
А то мне не удоётся получить список:
IniProfile *ini;
ini->GetSectionNames(???);


В метод GetSectionNames передаётся по ссылке (&) параметр - строковый контейнер (vector<string>), куда будут помещены названия секций.

2.7K
27 июля 2004 года
Iskander
13 / / 26.02.2003
Ребята, может я слишом стар, но когда винда только до 64 килобайт инишники тянула. Может в этом причина, хотя недавно обнаружил что работаю с инишником чуть болше 64 килобайт, под двухтонником.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог