Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.034 c
1-1090837961
Ibn El Ivan
2004-07-26 14:32
2004.08.08
Checklistbox


3-1089892499
ra4fcr
2004-07-15 15:54
2004.08.08
Как добавить записи в таблицу с ключевыми полями?


1-1090563325
goliath
2004-07-23 10:15
2004.08.08
Invalid canvas state request


1-1090479966
Lamer_Of_Delphi
2004-07-22 11:06
2004.08.08
Интерпретатор


11-1076835066
M5
2004-02-15 11:51
2004.08.08
Как выбрать каталог используя МСК?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский