Frage deutsch
~~~~~~~~~~~~~~~~
Wie lese und schreibe ich eine eigene INI-Datei?
 
Ich habe eine für mein QBasic-Programm eine INI-Datei angelegt, in der ich gewisse Kofigurations - Werte abgelegt habe. Die INI-Datei kann etwa wie folgt aufgebaut sein:
INI-DATEI:
A=2
S=7
...
I=4
H=3
ENDE DER INI-DATEI
Aus meinem Programm heraus will ich nun z.B. nur den nach "H=" hinterlegten Wert auslesen! Wie geht das ?
 

Question English
~~~~~~~~~~~~~~~~
How to read and write my own INI file?
 

Antwort 1
~~~~~~~~~~~~~~~~
[ von Ch@rly (
karl.pircher*gmx.net ) im QB-Forum, 5.5.03 ]
.
Ich habe vor langer Zeit für diesen Zweck die Routinen ReadIni und WriteIni geschrieben. Es erfolgt darin keine Fehlerkontrolle, sodass bei ReadIni ein Fehler auftritt, wenn die Datei z.B. nicht gefunden wird. Bei WriteIni wird sie in diesem Falle angelegt. Aber auch hier kann es zu Fehlern kommen, falls die Datei z.B. schreibgeschützt ist, oder das Laufwerk/Pfad nicht existiert.
 

Programm WriteInit zum Schreiben der INI-Datei:
 
DECLARE FUNCTION Writeini! (abschnitt$, eintrag$, wert$, Datei$)
CLS
a = Writeini("Abschnitt1", "Eintrag4", "test1", "c:\tmp\test.ini")
'
FUNCTION Writeini (abschnitt$, eintrag$, wert$, Datei$)
'-------------------------------------------------Eintrag in INI Datei schreiben
'
' Version 1.12 30/08/2000 by PeKa Soft Autor : Pircher Karl
'
' Diese Routine schreibt einen Eintrag in eine INI Datei
'
' Aufbau der INIDATEI
' Jeder Abschnitt beginnt mit einem Titel, welcher in eckigen Klammern steht
' Jeder Eintrag besteht aus einer Bezeichnung, gefolgt von einem ISTGLEICH
' ISTGLEICH (=) und dem Eintrag selber.
' Achtung !!! Es wird nicht abgeprueft, ob die Datei vorhanden ist, so daá
' es zu einer Fehlermeldung kommt, falls die Datei wirklich nicht vorhanden
' vorhanden ist. Dies sollte vor dem Aufruf der Routine abgeprueft werden.
' Falls ein Abschnitt oder ein Eintrag nicht vorhanden sein sollte, so wird
' er automatisch angelegt
'
' Rueckgabe : -1 wenn der Eintrag gel"scht wurde.
' Leerstring bei erfolgreichem L"schen
dat$ = UCASE$(Datei$)
dat1$ = LEFT$(dat$, LEN(dat$) - 3) + "$$$"
IF fehler <> 0 THEN
EXIT FUNCTION
END IF
ab$ = "<" + UCASE$(abschnitt$) + ">"
ab1$ = "<" + abschnitt$ + ">"
ein$ = UCASE$(eintrag$)
kanalin = FREEFILE
OPEN dat$ FOR APPEND AS #kanalin
CLOSE #kanalin
OPEN dat$ FOR INPUT AS #kanalin
kanalout = FREEFILE
OPEN dat1$ FOR OUTPUT AS #kanalout
status = 0
flag = 0
WHILE NOT EOF(kanalin)
LINE INPUT #kanalin, a$
IF UCASE$(a$) = ab$ THEN
PRINT #kanalout, a$
flag = 1
status = 0
WHILE status = 0
IF NOT EOF(kanalin) THEN
LINE INPUT #kanalin, b$
c$ = LEFT$(b$, LEN(ein$))
d$ = UCASE$(c$)
IF LEFT$(b$, 1) = "<" THEN
status = 2
IF flag = 1 THEN
PRINT #kanalout, eintrag$ + "=" + wert$
PRINT #kanalout, ""
flag = 2
END IF
END IF
IF d$ = ein$ THEN
PRINT #kanalout, c$ + "=" + wert$
flag = 2
status = 4
ELSE
IF b$ = SPACE$(LEN(b$)) THEN ' Wenn nur Leerzeichen, dann
b$ = "" ' Leerstring erzeugen
END IF
IF b$ <> "" THEN ' Ausfilterns Leerstring
PRINT #kanalout, b$
END IF
END IF
ELSE
status = 3
PRINT #kanalout, ein$ + "=" + wert$
END IF
WEND
ELSE
PRINT #kanalout, a$
END IF
WEND
IF flag = 0 THEN
PRINT #kanalout, ""
PRINT #kanalout, "<" + abschnitt$ + ">"
PRINT #kanalout, ein$ + "=" + wert$
END IF
CLOSE #kanalout
CLOSE #kanalin
SHELL "copy " + dat1$ + " " + dat$ + " >nul"
KILL dat1$
Writeini = -1
END FUNCTION
 
 

Programm ReadIni zum Lesen der INI-Datei:
 
DECLARE FUNCTION readini$ (datei$, abschnitt$, eintrag$)
CLS
REM----------------------------------------------Hauptprogramm
datei$ = "c:\windows\win.ini"
abschnitt$ = ""
eintrag$ = "device="
a$ = readini$(datei$, abschnitt$, eintrag$)
PRINT "Ergebnis : "; a$
END
'
FUNCTION readini$ (datei$, abschnitt$, eintrag$)
'-------------------------------------------------Eintrag aus INI Datei lesen
'
' Version 1.0 30/08/2000 by PeKa Soft Autor : Pircher Karl
'
' Diese Routine liest einen Eintrag aus einer INI Datei
' Aufbau der INIDATEI
' Jeder Abschnitt beginnt mit einem Titel, welcher in eckigen Klammern steht
' Jeder Eintrag besteht aus einer Bezeichnung, gefolgt von einem ISTGLEICH
' ISTGLEICH (=) und dem Eintrag selber.
' Achtung !!! Es wird nicht abgeprueft, ob die Datei vorhanden ist, so daá
' es zu einer Fehlermeldung kommt, falls die Datei wirklich nicht vorhanden
' vorhanden ist. Dies sollte vor dem Aufruf der Routine abgeprueft werden.
'
' Syntax : a$=readin$(datei$,abschnit$,eintrag$)
' Rueckgabe : readini$ enth„lt den gelesenen Eintrag oder einen Leerstring
'
dat$ = UCASE$(datei$)
ab$ = UCASE$(abschnitt$)
ein$ = UCASE$(eintrag$)
OPEN dat$ FOR INPUT AS #3
status = 0
WHILE status = 0
IF NOT EOF(3) THEN
LINE INPUT #3, a$
ELSE
status = 1
END IF
IF UCASE$(a$) = ab$ THEN
status = 0
WHILE status = 0
IF NOT EOF(3) THEN
LINE INPUT #3, b$
ELSE
status = 3
END IF
c$ = LEFT$(b$, LEN(ein$))
c$ = UCASE$(c$)
IF c$ = ein$ THEN
status = -1
ELSEIF LEFT$(b$, 1) = "<" THEN
status = 2
END IF
WEND
END IF
WEND
CLOSE #3
IF status = -1 THEN
readini$ = b$
ELSE
readini$ = ""
END IF
END FUNCTION
 
 
 

Antwort 2
~~~~~~~~~~~~~~~~
[ von Andre Klein ("A.K.";
webmaster*iconsoft.de ) im QB-Forum, 9.5.2003 ]
 
*** So lädst und durchsuchst Du eine INI-Datei
 
var$ = "ABC"
such$ = VAR$
OPEN INI$ FOR INPUT AS #1
DO UNTIL EOF(1)
INPUT #1, A$
IF LEFT$(A$, LEN(such$)) + "=" = such$ + "=" THEN
WERT = VAL(MID$(A$, LEN(such$) + 2, LEN(A$) - LEN(such$) - 1))
EXIT DO
ELSE
WERT = 9999999 'Eintrag wurde nicht gefunden!
END IF
LOOP
CLOSE
 
*** Und so speicherst Du sie wieder ab
 
' geschrieben von Andre Klein (A.K.)
'
' Hier eine Moeglichkeit eine INI-Datei abzuspeichern
'
' Programmerklaerungen
' newentry$ bezeichnet den Eintrag der Veraendert werden soll
' Das heiát: - Wenn es einen Eintrag in der INI gibt der den gleichen
' Variablennamen hat wie der in newentry$ dann wird nur der
' wert von diesem Eintrag geaendert.(Der Rest bleibt so!)
' - Wenn es diesen Variablennamen nicht gibt dann wird bei
' notfoundnew%=0 beendet und bei notfoundnew%=1 ein neuer
' Eintrag in die INI geschrieben
'
'
CLS
'
'Parameter
newentry$ = "b400=123"
inifile$ = "test.ini"
notfoundnew% = 1
'
'newentry$ zerlegen
ptr% = INSTR(newentry$, "=")
IF ptr% = 0 THEN PRINT "Variable wurde kein Wert zugewiesen!": END
newentryvar$ = MID$(newentry$, 1, ptr% - 1)
'
'hier werden die Zeilen gez„hlt
OPEN inifile$ FOR INPUT AS #1
DO UNTIL EOF(1)
INPUT #1, a$
zeilen% = zeilen% + 1
LOOP
CLOSE #1
'
'anlegen eines DF in dem alle Zeilen der INI-gespeichert werden
DIM zeile(1 TO zeilen%) AS STRING
'
'alle Zeilen der INI ins DF zeile einlesen und bei VarName-Ueber-
'einstimmung schon aendern
OPEN inifile$ FOR INPUT AS #1
such$ = newentryvar$
found% = 0
FOR i% = 1 TO zeilen%
INPUT #1, a$
IF LEFT$(a$, LEN(such$)) + "=" = such$ + "=" THEN a$ = newentry$: found% = 1
zeile(i%) = a$
NEXT i%
CLOSE #1
'
'VarName nicht gefunden und keinen neuen Eintrag erstellen
IF (found% = 0) AND (notfoundnew% = 0) THEN
PRINT "alten Eintrag nicht gefunden, kein neuer erstellt"
END IF
'
'VarName nicht gefunden und neuen Eintrag erstellen
IF (found% = 0) AND (notfoundnew% = 1) THEN
OPEN inifile$ FOR APPEND AS #1
PRINT #1, newentry$
CLOSE #1
END IF
'
'Eintraege geaendert abspeichern in der INI
IF found% = 1 THEN
OPEN inifile$ FOR OUTPUT AS #1
FOR i% = 1 TO zeilen%
a$ = zeile(i%)
PRINT #1, a$
NEXT i%
CLOSE #1
END IF
'
'ENDE
 
 
*** Anmerkungen
1. alles was nach dem = kommt, muß eine Zahl sein
2. es sollten keine Leerstellen im Eintrag vorkommen außer man will es so!
Beispiel: "A=100" ist nicht gleich "A =100"

[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]