Seite 1 von 1
INI Dateien mit Leerzeichen beim Gleichzeichen
Verfasst: 04.12.2006 19:57
von AND51
Hallo!
Wenn ich eine INI-Datei erstellte, dann sieht sie so aus:
Es wird immer ein Leerzeichen vor und nach dem gleichheitszeichen gesetzt. Ich möchte eine fremde INI auslesen, bei der diese Leerzeichen nicht existieren; das Lesen funktioniert korrekt. Aber wenn ich den Wert verändern will, dann erscheinen ja wieder die Leerzeichen.
Kann man das abstellen? Oder muss ich doch die ganze INI Datei einlesen und neu schreiben - manuell?
Verfasst: 04.12.2006 20:14
von #NULL
du kannst doch die ini-funktionen benutzen, und danach die erstellte datei einfach nochmal schnell formatieren.
z.b. zeile für zeile mit
ReplaceString( zeile$, " = ", "=" )
Verfasst: 04.12.2006 20:17
von mk-soft
INI-Dateinen immer nur mit "PureBasic - Preference" oder mit WinAPI lesen und erzeugen.
Ist aber ungewöhnlich das es Leerzeichen vor dem Gleichzeichen gibt.
Standard ist ohne Leerzeichen (API)
Das Leerzeichen nach dem Gleichzeichen kann nur sein wenn es im Wert mit angegeben ist.
Edit: Falsch: Leerzeichen am Anfang und Ende werden entfernt.
FF

Verfasst: 04.12.2006 20:23
von #NULL
atAND
hast du mal probiert, ob das fremde programm die *.ini auch mit leerzeichen versteht?
Verfasst: 04.12.2006 20:28
von mk-soft
Habe noch ein mal getestet.
Ungültige Leerzeichen werden entfernt. Die INI-Datei mit Leerzeichen wurde wohl nicht nicht den Standard-Funktionen angelegt. Lesen ist keine Problem. Nur Schreiben kann zu einen Problem führen wenn das Programm welches die Datei erzeugt has damit nicht klar kommt.
Verfasst: 04.12.2006 23:04
von ts-soft
Ini-Datei <> Preference-Datei
Ini-Dateien können nur per API erzeugt werden, unterliegen dann auch den
Einschränkungen. Preference-Dateien sind weitgehend kompatibel, aber nicht
gleich!
Verfasst: 04.12.2006 23:26
von AND51
Hallo!
Also ich meine hier die Preference-Dateien, die man mit PureBasic erstellen kann. Ich habe gerade folgenden Code ausgeführt (PB 4.01):
Code: Alles auswählen
CreatePreferences("D:\temp\settings.ini")
PreferenceGroup("Test")
WritePreferenceString("key", "val")
WritePreferenceLong("wal", 4)
ClosePreferences()
Dabei kommt das hier heraus:
Hinweis: Um es zu verdeutlichen: eine Raute # stellt ein Leerzeichen dar, welches ich nicht dort haben will.
Die fremde INI, auf die ich zugreifen will, sieht z. B. so aus:
Code: Alles auswählen
[URL]
Protocol=unreal
ProtocolDescription=Unreal Protocol
Name=userAgent
Map=Entry.unr
LocalMap=Intro.unr
Host=
Portal=
MapExt=unr
SaveExt=usa
Port=7777
Class=s_SWAT.s_Player_T
[FirstRun]
FirstRun=436
< Geht noch weiter... >
Wie man sieht, sind hier keine Leerzeichen vor oder nach den Gleichheitszeichen. Diese Datei könnte ich problemlos auslesen, aber wenn ich sie verändere/wiederbeschreiben will, entstehen halt diese L e e r z e i c h e n . . .

Verfasst: 04.12.2006 23:52
von mk-soft
Code: Alles auswählen
;-TOP
; Kommentar : Include INI-Dateien
; Author : mk-soft
; Second Author :
; Datei : INI-File.pb
; Version : 1.01
; Erstellt :
; Geändert : 02.10.2006
;
; Compilermode :
;
; ***************************************************************************************
Procedure GetSectionsNames(path.s, *list.s())
Protected *buffer, *adr, temp.s
*buffer = AllocateMemory($4000)
GetPrivateProfileSectionNames_(*buffer, $4000, path)
*adr = *buffer
Repeat
temp = PeekS(*adr)
If temp <> ""
AddElement(*list())
*list() = temp
EndIf
*adr + Len(temp) + 1
Until temp = ""
FreeMemory(*buffer)
EndProcedure
; ***************************************************************************************
Procedure GetSection(section.s, path.s, *list.s())
Protected *buffer, *adr, temp.s
*buffer = AllocateMemory($4000)
GetPrivateProfileSection_(section, *buffer, $4000, path)
*adr = *buffer
Repeat
temp.s = PeekS(*adr)
If temp <> ""
AddElement(*list())
*list() = temp
EndIf
*adr + Len(temp) + 1
Until temp = ""
FreeMemory(*buffer)
EndProcedure
; ***************************************************************************************
Procedure.s ReadINI(lpAppName.s, lpKeyName.s, lpFileName.s, lpDefault.s = "")
Protected *lpReturnedString
Protected Result.s
*lpReturnedString = AllocateMemory(1024)
lpDefault = ""
GetPrivateProfileString_(lpAppName, lpKeyName, lpDefault, *lpReturnedString, 1024, lpFileName)
Result.s = PeekS(*lpReturnedString)
FreeMemory(*lpReturnedString)
ProcedureReturn Result
EndProcedure
; ***************************************************************************************
Procedure WriteINI(lpszSection.s, lpszKey.s, lpszString.s, lpszFile.s)
Protected result
result = WritePrivateProfileString_(lpszSection, lpszKey, lpszString, lpszFile)
ProcedureReturn result
EndProcedure
; ***************************************************************************************
;- Test
NewList SectionsNames.s()
NewList Section.s()
path.s = GetCurrentDirectory() + "test.ini"
GetSectionsNames(path, SectionsNames())
ForEach SectionsNames()
Debug SectionsNames()
ClearList(Section())
GetSection(SectionsNames(), path, Section())
ForEach Section()
Debug Section()
Next
Next
; ***************************************************************************************
FF

Verfasst: 04.12.2006 23:57
von ts-soft
Verfasst: 05.12.2006 10:58
von horst
Achtung:
WritePrivateProfileString_() kann auf USB-Sticks (FAT32) ziemlich langsam sein.
Ich hab ein kleines Programm (MemPad) das über 10 Sekunden gebraucht hat, um zu schließen, wenn es vom USB-Stick (1 Gb) gestartet wurde. Mit den PB-Funktionen weniger als eine halbe Sekunde...