Zum Inhalt springen

Wie lese ich eine Konfiguration aus?


SNOWMAN

Empfohlene Beiträge

Hi,

ich hab da mal ne Frage:

Wie lese ich eine Konfigurationsdatei aus?

Also ihr kennt ja sicher diese config Dateien vom Apache oder anderen Programmen a la:


[Bereich1]

wert = abc

zahl = 7

blah...

[Bereich2]

wert2 = 9€

Reihenfolge = zyx

...

[Bereich...

wie lese ich sowas aus?

Wenn ein User nun neue Zeilen einfügt, oder längere werte, dann ist zB [bereich2] nicht mehr an der Position wie davor, somit geht sowas wie offset ja nicht.

thx

Link zu diesem Kommentar
Auf anderen Seiten teilen

wie lese ich sowas aus?

Zeile für Zeile durchgehen und jeweils erkennen, ob ein neuer Bereich anfängt. Ist das der Fall, dann darauf in irgendeiner Art und Weise reagieren.

In Java etwa so:

String currentBlockName         = null;

BufferedReader reader           = getBufferedReaderFromSomewhere();

for(String line = reader.readLine(); line != null; line = reader.readLine()) {


  if(line.length() < 1) {


    // Leerzeile - komplett ignorieren


  } else if(line.startsWith("[") && line.endsWith("]")) {


    // Neuer Abschnitt

    currentBlockName            = line.substring(1, line.length - 1);


  } else {


    // "Normale" Konfigurationszeile

    configureFromLine(currentBlockName, line);


  }


}

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 Wochen später...

Das schaut mir nach einer einfache INI-Datei aus.

Unter Windows gibt es dafür API-Funktionen, z.B. getPrivateProfileInt, getPrivateProfileString und so weiter....

Natürlich gibts das ganze auch mit setPrivate... um in die Datei zu schreiben

(mit diesen Funktionen kann man übrigens auch Registryeinträge auslesen/ändern)

Link zu diesem Kommentar
Auf anderen Seiten teilen


[Bereich1]

wert = abc

zahl = 7

blah...

[Bereich2]

wert2 = 9€

Reihenfolge = zyx

...

[Bereich...

Hallo, wie schon erwähnt handelt es sich hierbei um eine einfache Ini-Datei.

Der C-Builder und Delphi (von Borland) stellen dir zum auslesen einer solchen Datei ein Klasse namens TIniFile mit den Methoden kannst du diese Ini-Datei (konfigurationsdatei) super auslesen und die Hilfe dazu ist auch gut.

Aber auch andere Builder sollten eigentlich so eine Klasse bereitstellen :mod:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der C-Builder und Delphi (von Borland) stellen dir zum auslesen einer solchen Datei ein Klasse namens TIniFile

Das macht die Sache nicht grade portabel. Wenn das übrige Programm ohne spezielle Klassenbibliotheken auskommt, würde ich nur aufgrund einer ini-Datei keine solche Abhängigkeit einführen wollen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Jahr später...

Nochmal zur obigen Sache!

Wie würde das denn etwa in C++ aussehen. (Bin Newbie) Wäre toll, wenn da jemand helfen könnte.

Als Beispiel hier eine Konfigurationsdatei, die so aussieht:

set1=1

set2=2

set4=51
Es müsste eine Funktion sein, die heist
int getSetting(string SetText)
die mir einfach aus einer gewünschten Datei den gewünschten Wert (SetVal) zur entsprechenden Einstellung (SetText) ausgibt. Also etwa so:
int getSetting("set4")

Rückgabe = 51

Geht das mit einfachen Mitteln?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die Antwort!

Im einfachsten Fall die Datei zeilenweise auslesen, den gelesenen String beim '=' splitten, prüfen ob der linke Teil dem Suchstring entspricht und falls ja, den rechten teil zu int konvertieren und zurückgeben.

Das ganze berücksichtigt allerdings noch keine Sections, falls es solche geben sollte.

Das würde ich ja gerne machen, aber mit C++ bin ich nicht so bewandert, da ich mich mehr mit VB auskenne. Da würde ich mir instr(), mid() ... usw. zur Hand nehmen und hätte das im Handumdrehen fertig. Mit der C++Syntax kenne ich mich leider (noch) nicht so aus. Wenn ich diese Funktion nicht unter der Linux-Konsole bräuchte, wäre es mir ja egal, VB nützt mir in dem Fall leider nichts und muss mir halt anders helfen, indem ich nachfrage, wie man das macht! Ich hoffe, dass ich Hilfe bekomme!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Siehe hier für ein ähnliches Beispiel in C\C++. Musst nur noch ein wenig den Kopf anstrengen und schon haste das Ding Ruckzuck umgeschrieben.

Was musste tun?

Eigentlich recht simpel. Suchst nach dem auftreten der beiden Klammern. Den Text innerhalb der Klammern nimmst du zum Identifizieren des Blockes.

Da du nun weißt in welchem Block du bist. Kannst du innerhalb des Blockes bis zum "=" suchen. Damit hast du deinen Parameterbezeichner. Ab '=' bis 'CR' ist dann dein Parameter.

Das wiederholste bis Dateiende.

MVG

need-some-blood

Link zu diesem Kommentar
Auf anderen Seiten teilen

Siehe hier für ein ähnliches Beispiel in C\C++. Musst nur noch ein wenig den Kopf anstrengen und schon haste das Ding Ruckzuck umgeschrieben.

Was musste tun?

Eigentlich recht simpel. Suchst nach dem auftreten der beiden Klammern. Den Text innerhalb der Klammern nimmst du zum Identifizieren des Blockes.

Da du nun weißt in welchem Block du bist. Kannst du innerhalb des Blockes bis zum "=" suchen. Damit hast du deinen Parameterbezeichner. Ab '=' bis 'CR' ist dann dein Parameter.

Das wiederholste bis Dateiende.

MVG

need-some-blood

Danke für den Tip. Nur um nicht falsch verstanden zu werden. Das Problem ist für mich nicht der Lösungsweg an sich, sondern C++ selbst. Den Tip schaue ich mir mal genauer an Danke!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ne, das bekomme ich nicht hin. Wie ich schon gesagt habe, in VB ist das für mich locker. C++ leider weit weg.

Evtl. hilft es mehr wenn ich das an einem VB-Beispiel mache

Hier mal eine VB-Funktion getSetting().

Als Parameter wird Settext (ist der gesamte eingelesene Inhalt der Datei) angegeben

könnte so aussehen:


set1=1

set2=2

set3=51

Der Zweite Parameter Setting ist die gesuchte Einstellung z.B.: "set3"

Das sieht dann so in Gebrauch aus

getSetting(eingelesener Dateiinhalt, "set3")

Der Rückgabewert ist dann "51" als integer-Wert


Function getSetting(Settext As String, Setting As String) As Integer
Dim SetPos As Integer, readPos As Integer, EndPos As Integer, readlen As Integer

SetPos = InStr(1, Settext, Setting) //'Position des gesuchten Wertes ermitteln
readPos = InStr(SetPos, Settext, Chr(61)) + 1 //'hier wird die Position des "=" ermittelt
EndPos = InStr(readPos, Settext, Chr(10) & Chr(13)) //'Ende der Zeile ermitteln (hier Dos/Windows)

If EndPos = 0 Then EndPos = Len(Settext) //'nur zur Fehlervermeidung

readlen = EndPos - readPos + 1 //'Länge des gewünschten Wertes ermitteln

getSetting = CInt(Mid(Settext, readPos, readlen)) //'aus den ermittelten Werten das Ergebnis übergeben

End Function

[/PHP]

Es wird in dem Fall der komplette Dateiinhalt eingelesen und der gewünschte Paremeter gesucht, indem die Position und Länge ermittelt wird von der sich der Wert mit mid() auslesen lässt, sonst nichts. Also ohne jede Zeile einzeln einzulesen.

Für mich sieht das irgendwie aufgeräumter aus, als C++?:mod: Aber genau das bräuchte ich in C++. Ließe sich das nicht irgendwie umsetzen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...