INI Dateien mit Leerzeichen beim Gleichzeichen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

INI Dateien mit Leerzeichen beim Gleichzeichen

Beitrag von AND51 »

Hallo!

Wenn ich eine INI-Datei erstellte, dann sieht sie so aus:

Code: Alles auswählen

[Test]
key = val
wal = 4
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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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$, " = ", "=" )
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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 :wink:
Zuletzt geändert von mk-soft am 04.12.2006 20:23, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

atAND
hast du mal probiert, ob das fremde programm die *.ini auch mit leerzeichen versteht?
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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:

Code: Alles auswählen

[Test]
key#=#val
wal#=#4
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 . . . :|
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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 :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
horst
Beiträge: 70
Registriert: 08.09.2004 19:33
Wohnort: München
Kontaktdaten:

Beitrag 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...
horst
Antworten