SNOWMAN Geschrieben 22. Juni 2005 Geschrieben 22. Juni 2005 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 Zitieren
Monty82 Geschrieben 22. Juni 2005 Geschrieben 22. Juni 2005 Mit welcher Programmiersprache willst Du denn die Konfigurationsdatei einlesen? Zitieren
perdian Geschrieben 22. Juni 2005 Geschrieben 22. Juni 2005 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); } } Zitieren
SNOWMAN Geschrieben 22. Juni 2005 Autor Geschrieben 22. Juni 2005 @Monty: einfach nur so von der Logik, klar ist das von Sprache zu Sprache anders, aber es sind ja keine weltweiten Unterschiede @perdi: thx! Zitieren
FinalFantasy Geschrieben 8. Juli 2005 Geschrieben 8. Juli 2005 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) Zitieren
Terminator85 Geschrieben 14. Juli 2005 Geschrieben 14. Juli 2005 [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: Zitieren
Bubble Geschrieben 14. Juli 2005 Geschrieben 14. Juli 2005 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. Zitieren
Terminator85 Geschrieben 15. Juli 2005 Geschrieben 15. Juli 2005 :confused: man kann das was vorhanden ist auch alles selber nochmal neuschreiben wozu eine Entwicklungsumgebung ? Zitieren
perdian Geschrieben 15. Juli 2005 Geschrieben 15. Juli 2005 :confused: man kann das was vorhanden ist auch alles selber nochmal neuschreiben wozu eine Entwicklungsumgebung ?Es geht in diesem Unterforum um Algorithmik. Und die hat mit konkreten Entwicklungsumgebungen und Klassenbibliotheken erstmal recht wenig zu tun. Zitieren
dixidix Geschrieben 26. Juli 2006 Geschrieben 26. Juli 2006 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? Zitieren
FinalFantasy Geschrieben 26. Juli 2006 Geschrieben 26. Juli 2006 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. Zitieren
dixidix Geschrieben 27. Juli 2006 Geschrieben 27. Juli 2006 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! Zitieren
Amstelchen Geschrieben 27. Juli 2006 Geschrieben 27. Juli 2006 Wenn ich diese Funktion nicht unter der Linux-Konsole bräuchte, wäre es mir ja egal [...] vorschlag: warum verwendest du dann nicht das was die linux-konsole ausmacht, nämlich ein shellscript? s'Amstel Zitieren
dixidix Geschrieben 28. Juli 2006 Geschrieben 28. Juli 2006 Scriptlösungen wollte ich eigentlich vermeiden. Zitieren
need-some-blood Geschrieben 28. Juli 2006 Geschrieben 28. Juli 2006 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 Zitieren
dixidix Geschrieben 28. Juli 2006 Geschrieben 28. Juli 2006 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! Zitieren
dixidix Geschrieben 28. Juli 2006 Geschrieben 28. Juli 2006 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? Zitieren
Empfohlene Beiträge
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.