Aus ini lesen



  • 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!



  • ja, ich kenne die datei. man kann sie zufälligerweise ankucken. und sie ist in dem arbeitsordner des programms.



  • Windoof schrieb:

    Denk doch mal Objektorientiert...

    Und den spruch von dir... *lol*

    Vor Allem bei dem Kommentar:

    Windoof schrieb:

    Was ist einfacher? Ein Objekt mit logischem Aufbau und einfacher Handhabung oder mehrere TStringLists?

    brauchbarer wäre es wohl eine TStringList basierende Klasse zu bauen...

    Windoof schrieb:

    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...

    Ich warte noch immer... aber nur so btw: Du hast nix verstanden, gibs doch zu. Tipp: Ich rede von TStringList::Objects.

    What ever... mit dieser Diskussion ist nun ein Ende.

    -junix


Anmelden zum Antworten