Форум
Написать нам
  • Страница 1 из 1
  • 1
Модератор форума: as-master  
Работа с ini-файлами.
as-masterДата: Понедельник, 02 Июля 2007, 23:12 | Сообщение # 1
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Привожу вам текст о работе с ini-файлами.
Автор текста - Rush. Я просил его сделать из этого статью,
но в статью, к сожалению, так и не переросло.
Тем не менее, изложенное ниже представляется мне
весьма ценным и может оказаться полезным для многих.

____________________________________________________________

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

(к примеру, ты захотел из text.ini вытащить значения в 10 переменных)

Code
N=0
ini$='<SrcDir>\data\text.ini'
For i=1 To NOL(ini$)
      string$=StrFromFile(ini$,i,1)
      If (POS(=,string$)<>0 & string$<>'') Then
        N=N+1
        pos=POS(=,string$)
        txt$[N]=StrDel(string$,1,pos)
      End
Next i

Это универсальный по длине файла скрипт, для любой длины
заголовков - хоть 1 знак, хоть 20 - ему без разницы.

Переменная N и блок If...End нужны для того, чтобы не считывались
и не создавали переменных txt$ пустые строки и строки без заголовков.
Правда для твоего конкретного случая лучше написать не
If (POS(=,string$)<>0 & string$<>'') Then
а
If (POS(txt,string$)=1) Then
поскольку все заголовки начинаются с txt и считывать нужно только их.

Более того - если у тебя в ини-файле хранится нужная переменная
под заголовком, например, МояПеременная=, то написав

Code
ini$='<SrcDir>\data\text.ini'
For i=1 To NOL(ini$)
      string$=StrFromFile(ini$,i,1)
      If (POS(МояПеременная=,string$)<>0) Then
        MyText$=StrChange(string$,МояПеременная=,'')
      End
Next i

ты загрузишь в переменную MyText$ нужную тебе строку, даже когда не знаешь
под каким номером строки она находится в файле. Это я обдумал в свое время для того,
чтобы находить нужный параметр, даже если пользователь правил ини-файл
вручную и попутал строки.
Вот почему я так настоятельно тебе про заголовки говорю - чтобы не зависеть
от номера строки, а считывать именно нужный тебе параметр.

Вообще, стандартный ини-файл состоит из:
1) Секция
2) Ключ
3) Значение

Секция обозначается через квадратные скобки. Например, [General].
Ключ (я называл его заголовком) вот таким образом - MyKey=
А значение - это все, что находится в строке после ключа.

Пример ини-файла (пустые строки не важны, их можно и убрать):

[1]

1=один
2=два
3=три

[2]

1=101
2=102
3=103

[3]

1=совсем один
2=пара
3=еще больше

Продолжение ниже...


Да пребудет с вами ММВ!
 
as-masterДата: Понедельник, 02 Июля 2007, 23:13 | Сообщение # 2
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Продолжение, начало см.выше.

Первое действие - надо загрузить из ини-файла при старте проекта все
значения в нужные переменные.

Code
N=0
ini$='<SrcDir>\data\text.ini'
For i=1 To NOL(ini$)
       string$=StrFromFile(ini$,i,1)
       If (POS([,string$)<>0 & POS(],string$)<>0) Then
         For s=i+1 To NOL(ini$)
           string$=StrFromFile(ini$,s,1)
           If (POS(=,string$)<>0 & string$<>'') Then
             N=N+1
             pos=POS(=,string$)
             Section1$[N]=StrDel(string$,1,pos)
           End
           If (POS([,string$)<>0 & POS(],string$)<>0) Then
             N=0
             Break()
           End
         Next s
         If (s=NOL(ini$)) Then
           Break()
         End
         For s=s+1 To NOL(ini$)
           string$=StrFromFile(ini$,s,1)
           If (POS(=,string$)<>0 & string$<>'') Then
             N=N+1
             pos=POS(=,string$)
             Section2$[N]=StrDel(string$,1,pos)
           End
           If (POS([,string$)<>0 & POS(],string$)<>0) Then
             N=0
             Break()
           End
         Next s
         If (s=NOL(ini$)) Then
           Break()
         End
         For s=s+1 To NOL(ini$)
           string$=StrFromFile(ini$,s,1)
           If (POS(=,string$)<>0 & string$<>'') Then
             N=N+1
             pos=POS(=,string$)
             Section3$[N]=StrDel(string$,1,pos)
            End
           Next s
       End
       Break()
Next i

Несмотря на, вроде бы, большую длину и использование 4-х циклов,
сам "Суперцикл" работает как один цикл - делает количество оборотов равным
количеству строк файла. Главный цикл запускает поиск секций,
он работает всего столько оборотов, сколько нужно до того момента,
пока не найдется первая секция. Сделан для того, чтобы не зависеть от
пустых строк в начале файла или комментариев, которые можно вставлять
в начало файла. Вообще все, что не имеет отношения к секции и к ключу, в
этом скрипте не считывается.
Соответственно 2, 3 и 4 циклы работают только пока находятся внутри секций.
В данном примере значения ключей загружаются в три массива (посекционно).
Главное, число оборотов "Суперцикла" не зависит от количества секций.
Если добавить 4-ю секцию и дописать внутрь заместо последней строчки Next s
еще один цикл

Code
If (POS([,string$)<>0 & POS(],string$)<>0) Then
             N=0
             Break()
           End
         Next s
         If (s=NOL(ini$)) Then
           Break()
         End
         For s=s+1 To NOL(ini$)
           string$=StrFromFile(ini$,s,1)
           If (POS(=,string$)<>0 & string$<>'') Then
             N=N+1
             pos=POS(=,string$)
             Section4$[N]=StrDel(string$,1,pos)
           End
         Next s

то число оборотов "Суперцикла" останется равным длине файла.

А для чего это нужно? Таким образом создаются независимые друг от друга
секции ини-файла, в которые можно добавлять ключи. При этом другие секции
не будут трогаться. Вроде как - несколько ини-файлов в одном.

Прикрепления: 19325669.zip (1.9 Kb)


Да пребудет с вами ММВ!
 
  • Страница 1 из 1
  • 1
Поиск: