Aus ini lesen
-
hi,
wenn ich aus einer ini datei einen wert einlesen will, nimmt er immer den default wert. was ist da falsch?
TIniFile *ini; ini = new TIniFile(ChangeFileExt(Application->ExeName, "Bsp.INI" )); Edit1->Text = ini->ReadInteger("Bsp", "Wert1", 100);danke für die hilfe
-
Schau dir mal das Resultat von ChangeFileExt an, indem du das Resultat in einen AnsiString zwischenspeicherst...
-junix
-
Was steht denn in deine INI-Datei drin?
sollte so aussehen:
[Bsp]
Wert1=99Außerdem ist doch der zweite Parameter von ChangeFileExt() die Dateierweiterung, also sollte da nur ".ini" stehen.
GL bais
-
bais schrieb:
Außerdem ist doch der zweite Parameter von ChangeFileExt() die Dateierweiterung, also sollte da nur ".ini" stehen.
Präzise darauf wollte ich hinaus (o; Nur wollte ich ihm einen Weg aufzeigen, wie man an solche Fehler selber rankommt... (o;
-junix
-
gut ich habs aus der hilfe abgeschrieben, deswegen weiss ich auch nicht genau wie das genau funktionieren soll. woher soll der denn wissen aus welcher datei gelesen werden soll?
-
Was steht denn in der Dokumentation des Konstruktors von TIniFile?
-junix
-
ich weiss nicht, was da drin stehen soll? keine ahnung. weiss auch nich, wo ich das finden kann. wenn ich in der hilfe nach TIniFile suche, finde ich wie man das benutzt. also auf gut deutsch ich hab keine ahnung wie ich das machen soll.

-
Den hier kennst du schon, ja?
http://www.junix.ch/bcb/help
-
ok. danke für die antworten. habs jetzt durchblickt.

aber was ich eigendlich machen wollte:
ich möchte werte aus einer ini lesen, die nicht von meinem prog gemacht wurde und damit auch nicht so heisst. wie lässt sich das machen.
-
Indem du den richtigen Dateinamen angibst?
-junix
-
Es ist bestimmt auch nicht falsch, erst Werte in die Datei zu schreiben, bevor man welche auslesen will.
-
Ähm... davon würde ich doch eher abraten...
-
tuxman schrieb:
ich möchte werte aus einer ini lesen, die nicht von meinem prog gemacht wurde und damit auch nicht so heisst. wie lässt sich das machen.
Zuerst einmal musst du den Dateinamen ermitteln, dabei kann ich dir nicht helfen, aber die Werte aller Einträge kannst du so auswerten, auch wenn du sie nicht kennst:
#include<vector.h> // Für Vector :-) struct MyKey { AnsiString Name; AnsiString Value; }; struct MySection { AnsiString Name; vector<MyKey>Keys; }; vector<MySection>Sections; void __fastcall TForm1::Button1Click(TObject *Sender) { // Wenn Datei ausgewählt wurde... if (OpenDialog1->Execute()) { // Objekte initialisieren, die wir benötigen... TStringList* slSections=new TStringList; TStringList* slKeyValues=new TStringList; TIniFile* ini=new TIniFile(OpenDialog1->FileName); // Alle Sektoren der Ini-Datei auflisten ini->ReadSections(slSections); Sections.resize(slSections->Count); // Alle Sektoren durchgehen for (int i=0;i<slSections->Count;++i) { // Sektorennamen uebernehmen Sections[i].Name=slSections->Strings[i]; // Alle Werte in einem Sektor auflisten ini->ReadSectionValues(slSections->Strings[i],slKeyValues); Sections[i].Keys.resize(slKeyValues->Count); // Alle Werte durchgehen for (int j=0;j<slKeyValues->Count;++j) { // Namen des Wertes uebernehmen Sections[i].Keys[j].Name=slKeyValues->Strings[j].SubString(1,slKeyValues->Strings[j].Pos("=")-1); // Den Wert uebernehmen Sections[i].Keys[j].Value=slKeyValues->Strings[j].SubString(Sections[i].Keys[j].Name.Length()+1,slKeyValues->Strings[j].Length()-Sections[i].Keys[j].Name.Length()-1); } } delete ini; delete slSections; delete slKeyValues; } }Jetzt ist die ganze Ini-Datei in Sections gespeichert und lässt sich wunderbar auslesen...
-
Was soll dennn das jetzt mit dem Vector? Die StringLists sind doch völlig ausreichend, wenn man sich mal mit den passenden Eigenschaften beschäftigen würde.
Und Vector.h ist obsolete.
-junix
-
Klar, aber so hast du nur ein Objekt in der sie gesamte Datei gespeichert ist und kannst sie somit einfacher auswerten als wenn du einen haufen von StringLists hast... gut, man könnte ine Klasse schreiben mit Methoden wie FindKey oder so, aber das ist ja auch nur ein Beispiel, ich kann mich zuhause mal an eine Klasse setzen, oder zwei... mal gucken, ich poste sie dann mal...
MfG Windoof
-
Die ganze Splitterei der Keys etc. ist schon unsinnig.
Das Einzige was sinn machen könnte wäre das Speichern der TStringList Instanzen in einen Struct zusammen mit dem Section-Namen. Wobei ich da ebenfalls viel eher auf die zusätzlichen Möglichkeiten von TStringList bauen würde...
-junix
-
Denk doch mal Objektorientiert... Was ist einfacher? Ein Objekt mit logischem Aufbau und einfacher Handhabung oder mehrere TStringLists? Hmm... lass mich raten, du findest "Mehrere TStringLists" besser, wegen ihren Methoden... Ich sagte doch: Ich kann auch eine Klasse basteln, mit... Methoden. Poste ich nachher oder morgen noch. Wart's ab...
-
also noch mal von vorne:
ini = new TIniFile("Bsp.ini"); Edit1->Text = ini->ReadInteger("Bsp", "Wert1", 0);also die Ini aus der ich lesen will wurde schon von einem anderen programm angelegt. aber wenn ich es mit dem obigen code probiere nimmt er immer die default werte(0). was ist daran falsch?

-
wie sieht denn deine INI-Datei aus, wäre vielleicht hilfreich
-
Bist du sicher, dass du die richtige Ini-Datei liest?
Versuch's mal mit einer absoluten Pfadangabe, einschliesslich der Verzeichnisnamen, anstatt zu hoffen, dass das Programmverzeichnis (in dem wohl deine Ini liegt) auch das aktuelle Arbeitsverzeichnis ist.
-
tuxman schrieb:
also die Ini aus der ich lesen will wurde schon von einem anderen programm angelegt
Kennst Du ueberhaupt die Namen der Sctions und Keys in der Ini- Datei?

Danach wurdest Du schon mehrfach gefragt! Ohne die kannste das Auslesen lassen!