Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

трабла с ИНИ-файлами.   Найти похожие ветки 

 
Magic_STI   (2004-07-26 15:44) [0]

У меня прога создает довольно большой ИНИ-файл (около 1 Мб). Создается вроде нормально. Проверял блокнотом, вся инфа есть. А при чтении количество прочитанных секций оказывается гораздо меньше их реального количества. В чем дело? Может есть какое-то ограничение на размер. Если есть, то как его обойти? Заранее благодарен...


 
Digitman ©   (2004-07-26 15:49) [1]

что за блажь - хранить в текстовом виде в INI-формате такой бешеный объем данных ?


 
ssk ©   (2004-07-26 15:50) [2]

максимальный объем ИНИ 64к


 
Ega23 ©   (2004-07-26 15:54) [3]

2 Magic_STI
Проверь названия секций на "одинаковость". Может у тебя одно и то же имя несколько раз встречается...

2 ssk ©  
Точно? Откуда информация?


 
Magic_STI   (2004-07-26 15:58) [4]

Подскажи как? Нужно сохранить неограниченное количество записей вида
TMyRec = record
        head:string;
        fontsize:integer;
        text:string;
        end;
В принципе текст можно не в виде строки. Главное, чтобы он нормально потом читался.
Пытался делать нетипизированный файл. С ним возникли проблемы, поэтому забросил эту затею.
Может че подскажете?


 
Magic_STI   (2004-07-26 16:01) [5]

Секции точно не одинаковые.


 
Ega23 ©   (2004-07-26 16:06) [6]

Magic_STI   (26.07.04 15:58) [4]

1. Подцепи БД из одной таблички.
2. Используй для этого TClientDataSet.LoadFrom(SaveTo)File
3. Используй обычный текстовый файл, но между рекордами нужен какой-то разделитель.

Я бы воспоьлзовался 2-м способом.


 
KSergey ©   (2004-07-26 16:07) [7]

>  [4] Magic_STI   (26.07.04 15:58)
> Подскажи как? Нужно сохранить неограниченное количество
> записей вида
> TMyRec = record
>         head:string;
>         fontsize:integer;
>         text:string;
>         end;
> В принципе текст можно не в виде строки. Главное, чтобы
> он нормально потом читался.

Writeln/Readln?


 
Fay ©   (2004-07-26 16:09) [8]

Храни в XML. К примеру.


 
Ega23 ©   (2004-07-26 16:11) [9]

Writeln/Readln?

Если строка не имеет определённой длины, то это проблематично будет.
Если указать
TMyRec = record
        head:string[20];
        fontsize:integer;
        text:string[255];
        end;

тогда читаться всё будет хорошо, но будет храниться ненужная информация.


 
Digitman ©   (2004-07-26 16:13) [10]


> Нужно сохранить неограниченное количество записей вида
> TMyRec = record
>         head:string;
>         fontsize:integer;
>         text:string;
>         end;


СУБД


 
Magic_STI   (2004-07-26 16:14) [11]

Либо я буду пытаться что-то сделать с ИНИ, либо подскажите как хранить все это добро в нетипизированном файле. В обычный текстовый я скидывать не хочу, т.к. ч ним много мороки.


 
Anatoly Podgoretsky ©   (2004-07-26 16:16) [12]

Ega23 ©   (26.07.04 15:54) [3]
Из спецификации Микрософта


 
ssk ©   (2004-07-26 16:16) [13]

>Ega23 ©   (26.07.04 15:54) [3]

2 ssk ©  
Точно? Откуда информация?


здесь об этом можно прочесть
http://www.osp.ru/fullpc/10/10.htm

но это не докуметация, а просто очерк по настройке Вин98


 
Magic_STI   (2004-07-26 16:18) [14]

В том то и прикол, что текст длиннее чем 255 символов. Такого вида записи я бы и сам сделал...


 
Ega23 ©   (2004-07-26 16:21) [15]

2 Anatoly Podgoretsky ©   (26.07.04 16:16) [12]
2 ssk ©   (26.07.04 16:16) [13]

Просто лично мне никогда не попадалось такое. Да и работу с ini я по хелпу к Delphi осваивал. А там этого почему-то не сказано.
Буду знать.


 
KSergey ©   (2004-07-26 16:21) [16]

> [9] Ega23 ©   (26.07.04 16:11)

ну, признаться я не особо силен  в форматировании строк для Writeln/Readln. Судя по справке - не особо там гибко. Думал, что аналогично сишным printf/?... опа, забыл :(( Ну все поняли. (Позор моим сединам.)

Ну тогда формировать строку ручками (или через Format) с разделителями (строки в кавычки или сначала прописывать длину), а вот обратную ф-цию для "расшифровки", аналогично Format - что-то я не нашел.


 
Ega23 ©   (2004-07-26 16:22) [17]

В том то и прикол, что текст длиннее чем 255 символов. Такого вида записи я бы и сам сделал...

Читай про TClientDataSet.


 
Ega23 ©   (2004-07-26 16:26) [18]

2 KSergey ©   (26.07.04 16:21) [16]

Автор ветки в посте [4] написал:
Пытался делать нетипизированный файл. С ним возникли проблемы, поэтому забросил эту затею.
У меня сразу же возникло подозрение, что это было из-за неуказания длины строки.


 
Anatoly Podgoretsky ©   (2004-07-26 16:31) [19]

Выписка их справки
The GetPrivateProfileString function retrieves a string from the specified section in an initialization file. This function is provided for compatibility with 16-bit Windows-based applications. Win32-based applications should store initialization information in the registry.

Именно эти вызовы и используются в VCL


 
panov ©   (2004-07-26 16:34) [20]

см.

GetPrivateProfileStruct
WritePrivateProfileStruct


 
Magic_STI   (2004-07-26 16:35) [21]

В нетипизированном файле я в запись вставлял textlen:integer; Сохранял текст в строку и заполнял эту textlen:=sizeof(text);
Но когда читал этот файл, то нифига не получалось. Длина строки всегда читалась, как 4.


 
ПсихЪ_дубль   (2004-07-26 16:39) [22]

Алгоритм примерно следующий:
1. Создаёшь объект класса TFileStream;

ptocedure SaveMyRec( mr : MyRec; FileName : string );
var
 fs : TFileStream;
 cnt, i : integer;
begin
 fs := TFileStream( FileName );

2. Каждую элемент твоей записи сохраняешь через fs (в файл FileName)

 // Integer сохраняешь стандартно
 fs.WriteBuffer( mr.fontsize, SizeOf( integer ) );
 // Строки - хитрожопо
 cnt := Length( mr.head );
 fs.WriteInt( cnt ); // сохраняем количество символов в тексте
 for i := 1 to cnt do // сохраняем каждый символ текста
   fs.WriteBuffer( mr.head[i], SizeOf( char ) );
 // Ту же фигню проделываем и со вторым текстом
 cnt := Length( mr.text );
 fs.WriteInt( cnt );
 for i := 1 to cnt do
   fs.WriteBuffer( mr.text[i], SizeOf( char ) );
 fs.Destroy();
end;

Вот и всё. Так ты запишешь одну запись в нужный тебе файл. Для записи нескольких записей выносишь создание и удаление TFileStream в отдельную функцию, а между ними вставляешь цикл. Или как тебе удобнее.
Можно в начале файла ещё записать указатели на необходимые тебе блоки с записью, чтобы быстро обращаться к нужным. И т.д.
Читать по анологии, через тот же самый TFileStream. Объяснять не буду - сам шевели головой.

Работает быстрее, чем всякие там ИНИ-файлы и размер неограничен.


 
KSergey ©   (2004-07-26 16:39) [23]

> [21] Magic_STI   (26.07.04 16:35)
> В нетипизированном файле я в запись вставлял textlen:integer;
> Сохранял текст в строку и заполнял эту textlen:=sizeof(text);
> Но когда читал этот файл, то нифига не получалось. Длина
> строки всегда читалась, как 4.

А проверить, что и писалось всегда 4? И справочку по sizeof? :)
Использовать Length


 
sniknik ©   (2004-07-26 16:40) [24]

замени TIniFile на TRegistryIniFile переделок минимум, а регистр является практически базой данных. мег выдержит без проблем.


 
Magic_STI   (2004-07-26 16:41) [25]

Мне нужно получить имена ВСЕХ секций в файле.
Допустим, я пишу
var
f:tinifile;
sl:tstringlist;
begin
...
f.readsections(sl);
showmessage(inttostr(sl.count));
...
end;
На выходе получаю только 210 секций, хотя в файле их около 1000.
Почему?


 
ПсихЪ_дубль   (2004-07-26 16:41) [26]

Исправление:

procedure SaveMyRec( mr : MyRec; FileName : string );


 
ПсихЪ_дубль   (2004-07-26 16:43) [27]


> Magic_STI   (26.07.04 16:41) [25]

Видимо это тоже какое-то ограничение винды.

Можно нескромный вопрос? Зачем тебе это всё нужно, может быть для твоей задачи есть более элегантный способ её решения.


 
Magic_STI   (2004-07-26 16:46) [28]

Пасиб, седня попробую вариант со стримом. А в реестре я хранить данные не могу. Это отдельные файлы, а не настройки программы. Эти файлы нужно перемещать вместе в прогой.


 
Magic_STI   (2004-07-26 16:53) [29]

Задача такая:
Существует несколько RTF-файлов. Которые построены по принципу дерева. Т.е. в них имеются заголовки разного размера. Чем больше размер, тем выше узел в конечном дереве. Также в этом файле у некоторых узлов имеется текст, который нужно сохранить. Функция сканирует эти файлики по очереди и выделяет каждый узел в запись, вида
head:string; //имя узла, с учетом родителей
fontsize:integer;//размер шрифта заголовка узла
text:string; //текст узла, если нету, то текст=""
Потом функция записывает эти записи по очереди.
Задача: после чтения файла построить из них дерево, чтобы при выделении какого либо узла, из файла читался его текст, если есть.

В случае с ИНИ все прекрасно работает, но вот такая вот досадная проблема :-(((


 
Anatoly Podgoretsky ©   (2004-07-26 16:59) [30]

Из той же справки
Win32-based applications should store initialization information in the registry.

Из материалов Микрософт, не пишите свыше 8к в реестр, используйте вместо этого файлы, поскольку не помойка

Обзорная статья Как хранить настройки программ. http://podgoretsky.com/ftp/Language/nps/ru.delphi.html#N146


 
Magic_STI   (2004-07-26 17:02) [31]

Еще раз повторяю, это НЕ настройки программы!


 
Anatoly Podgoretsky ©   (2004-07-26 17:15) [32]

Magic_STI   (26.07.04 17:02) [31]
При чем тогда ини, по определению это файл параметров, как ты из не называй.


 
Magic_STI   (2004-07-26 17:18) [33]

Мне просто удобно было хранить данные в файле ИНИ-типа.


 
Zelius ©   (2004-07-26 17:20) [34]

Попробуй TMemIniFile, интерфейс такой же как у TIniFile, но нет его ограничений.


 
Magic_STI   (2004-07-26 17:23) [35]

Точна?


 
Anatoly Podgoretsky ©   (2004-07-26 17:48) [36]

Magic_STI   (26.07.04 17:18) [33]
Ини файл

Секция
Параметр=значение

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


 
Magic_STI   (2004-07-26 18:05) [37]

Грустна :-((( Ладненько, попробуем все варианты, которые мне посоветовали. Усим огромный респект. Благодарю за внимание...


 
sniknik ©   (2004-07-27 08:22) [38]

> Из материалов Микрософт, не пишите свыше 8к в реестр, используйте вместо этого файлы, поскольку не помойка
в общий да, лучше не писать, но ничего не мещает собственный организовать. (только разширение reg ему не делать а то по случайному нажатию можно его к общему добавить, а там и так... у меня он 80мег, сейчас ;о)


 
mutabor   (2004-07-27 08:39) [39]

2Magic_STI:
возможно поздно, но все же:а  xml нельзя было использовать?



Страницы: 1 вся ветка

Текущий архив: 2004.08.08;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.026 c
1-1090503006
BillyJeans
2004-07-22 17:30
2004.08.08
Canvas.TextOut


3-1089838751
CAMCOH
2004-07-15 00:59
2004.08.08
SQL запрос в Adoquery


3-1089617066
Prohodil Mimo
2004-07-12 11:24
2004.08.08
При загрузке системы почему-то стал отключаться сервер ИБ.


14-1090237879
sucer
2004-07-19 15:51
2004.08.08
Подержка длинных имен под DOS


14-1089872625
menart
2004-07-15 10:23
2004.08.08
Борьба с мышами