PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Программирование на PureBasic » Виртуальный ini-файл


Виртуальный ini-файл

Сообщений 1 страница 4 из 4

1

Первая попытка самостоятельно прочитать/разобрать ini файл

Код:
EnableExplicit

Structure KeyVal
    Key.s
    Value.s
EndStructure

Structure Group
    List KeyVal.KeyVal()
EndStructure

NewMap virtini.Group()

Procedure Read_INI(Map virtini.Group(), Path$)
	Protected tmp, tmp$, StrN$
	Protected id, Pos
	Protected NotGrOpen = 1

	If FileSize(Path$) > 4
    id = ReadFile(#PB_Any, Path$)
    If id
        While Eof(id) = 0
            StrN$ = ReadString(id)
            StrN$ = RTrim(StrN$, " ")
            Repeat ; цикл удаления пробельных символов в начале строки
     	       tmp = Asc(StrN$)
            	Select tmp
                Case 32, 9, 160
                	StrN$ = LTrim(StrN$, Chr(tmp))
                Default
                	Break
            	EndSelect
            ForEver
            If Asc(StrN$) = 59 ; Если комментарий то читаем следующую строку
            	Continue
            EndIf
            If Asc(StrN$) = 91 ; Если открывается группа, то читаем её имя
            	Pos = FindString(StrN$, "]", 3, #PB_String_CaseSensitive)
    	        If Pos And AddMapElement(virtini(), Mid(StrN$, 2, Pos - 2), #PB_Map_NoElementCheck) ; добавляем элемент карты, потом элемент списка
            NotGrOpen = 0
        	EndIf
        	Continue
            EndIf
            If NotGrOpen ; Если нет открытой группы, то пропускаем текущую строку, до тех пор пока не будет открыта, т.к. параметры и значения могут быть только в группе
            	Continue
            EndIf
            Pos = FindString(StrN$, "=", 2, #PB_String_CaseSensitive)
            If Pos
            	If AddElement(virtini()\KeyVal())
                virtini()\KeyVal()\Key = Left(StrN$, Pos - 1)
                virtini()\KeyVal()\Value = Mid(StrN$, Pos + 1)
            	EndIf
            ElseIf Asc(StrN$) And AddElement(virtini()\KeyVal())
            	virtini()\KeyVal()\Key = StrN$
            EndIf
        Wend
        CloseFile(id)
    EndIf
	EndIf
	
EndProcedure

Read_INI(virtini(), "C:\desktop-файлы\shutter.desktop")

ForEach virtini()
	Debug  #CRLF$ + "[" + MapKey(virtini()) + "]"
	ForEach virtini()\KeyVal()
    Debug virtini()\KeyVal()\Key + " = " + virtini()\KeyVal()\Value
	Next
Next

полное использование Карты

Код:
EnableExplicit

Structure Group
	Map KeyVal.s()
EndStructure

NewMap virtini.Group()

Procedure Read_INI(Map virtini.Group(), Path$)
	Protected tmp, tmp$, StrN$
	Protected id, Pos
	Protected NotGrOpen = 1
	
	If FileSize(Path$) > 4
    id = ReadFile(#PB_Any, Path$)
    If id
    	While Eof(id) = 0
        StrN$ = ReadString(id)
        StrN$ = RTrim(StrN$, " ")
        Repeat ; цикл удаления пробельных символов в начале строки
        	tmp = Asc(StrN$)
        	Select tmp
            Case 32, 9, 160
            	StrN$ = LTrim(StrN$, Chr(tmp))
            Default
            	Break
        	EndSelect
        ForEver
        If Asc(StrN$) = 59 ; Если комментарий то читаем следующую строку
        	Continue
        EndIf
        If Asc(StrN$) = 91 ; Если открывается группа, то читаем её имя
        	Pos = FindString(StrN$, "]", 3, #PB_String_CaseSensitive)
        	If Pos And AddMapElement(virtini(), Mid(StrN$, 2, Pos - 2), #PB_Map_NoElementCheck) ; добавляем элемент карты, потом элемент списка
            NotGrOpen = 0
        	EndIf
        	Continue
        EndIf
        If NotGrOpen ; Если нет открытой группы, то пропускаем текущую строку, до тех пор пока не будет открыта, т.к. параметры и значения могут быть только в группе
        	Continue
        EndIf
        Pos = FindString(StrN$, "=", 2, #PB_String_CaseSensitive)
        If Pos
        	tmp$ = Left(StrN$, Pos - 1)
        	tmp$ = RTrim(tmp$, " ") ; удаляем пробелы вокруг "="
        	If AddMapElement(virtini()\KeyVal(), tmp$, #PB_Map_NoElementCheck)
            tmp$ = Mid(StrN$, Pos + 1)
            tmp$ = LTrim(tmp$, " ") ; удаляем пробелы вокруг "="
            virtini()\KeyVal() = tmp$
        	EndIf
        ElseIf Asc(StrN$)
        	AddMapElement(virtini()\KeyVal(), StrN$, #PB_Map_NoElementCheck)
        EndIf
    	Wend
    	CloseFile(id)
    EndIf
	EndIf
	
EndProcedure

Read_INI(virtini(), "C:\shutter.desktop")

ForEach virtini()
	Debug  #CRLF$ + "[" + MapKey(virtini()) + "]"
	ForEach virtini()\KeyVal()
    Debug MapKey(virtini()\KeyVal()) + " = " + virtini()\KeyVal()
	Next
Next

; Доступ к значению по имени Секция + Ключ
MessageRequester("", virtini("Desktop Action Screen")\KeyVal("Exec"))

Отредактировано AZJIO (15.08.2021 17:39:16)

0

2

альтернативной вариант https://github.com/kenmo-pb/includes/bl … er/ini.pbi

имхо такие вещи удобнее в виде модулей делать

0

3

Можно сделать проще. Прочитать все содержимое файла функциями ExaminePreferenceGroups, ExaminePreferenceKeys и другими. Сохранять методом создания файла (CreateFile) и записи строк (WriteStringN).

0

4

Пётр
Ну да. Разве что можно правила немного свои сделать.
В плане предыдущей задачи с desktop-файлом я решил просто прочитать файл и сохранить без метки BOM вначале я хотел прочитать с указателя 3, потом поставить на указатель 0 в файле чтобы затереть поверх метки, а потом обрезать (TruncateFile), но в итоге ничего не менялось файл оставался с меткой BOM, как будто она сама по себе, а начало файла подразумевается от его контента, а не от метки BOM, пришлось удалить файл и с того же буфера памяти создать новый (CreateFile). Я там прогу обновил.

Код:
EnableExplicit

Structure Group
	Map KeyVal.s()
EndStructure

NewMap virtini.Group()

Procedure Read_INI(Map virtini.Group(), Path$)
	If OpenPreferences(Path$)
    ExaminePreferenceGroups()
    While NextPreferenceGroup()
    	AddMapElement(virtini(), PreferenceGroupName(), #PB_Map_NoElementCheck)
    	ExaminePreferenceKeys()
    	While  NextPreferenceKey()
        If AddMapElement(virtini()\KeyVal(), PreferenceKeyName(), #PB_Map_NoElementCheck)
        	virtini()\KeyVal() = PreferenceKeyValue()
        EndIf
    	Wend
    Wend
    ClosePreferences()
	EndIf
EndProcedure

Read_INI(virtini(), "C:\shutter.desktop")

ForEach virtini()
	Debug  #CRLF$ + "[" + MapKey(virtini()) + "]"
	ForEach virtini()\KeyVal()
    Debug MapKey(virtini()\KeyVal()) + " = " + virtini()\KeyVal()
	Next
Next

MessageRequester("", virtini("Desktop Action Screen")\KeyVal("Exec"))

Отредактировано AZJIO (19.08.2021 02:44:18)

0


Вы здесь » PureBasic - форум » Программирование на PureBasic » Виртуальный ini-файл