IniFile anderes Format



  • Hallo

    Öffne die Datei und lies mittels getline die gewünschten Zeilen aus. Diese speicherst du in einen vector von strings und wertest diesen dann aus.

    chrische



  • Hallo

    Und genau zu sein ist dafür TStringList am besten geeignet. Siehe SuFu und Builder-Hilfe.

    bis bald
    akari



  • Danke erst mal für die Antworten, nur das mit getline habe ich nicht hinbekommen, ich habe es jetzt so:

    TStringList *TempList = new TStringList;
       TempList->LoadFromFile(data);
       int index_a=TempList->IndexOf("[HRData]");
       int index_e=400;
       for (int i=index_a+1;i<index_e+index_a;i++)
       {
            if(StrToInt(TempList->Strings[i].SubString(1,1))>0)
            {
            Memo1->Lines->Add(TempList->Strings[i]);
            }
       }
    
      delete TempList;
    

    Ich weiß nicht ob das eleganter geht.Mein Problem ist jetzt das Ende des Files zu finden, das sollte dann index_e werden(ist jetzt eine absolute zahl).



  • Hallo

    1. getline kannst du bei TStringList und AnsiString nicht einsetzen. brauchst du auch nicht.

    2. Ja das ist in Ordnung.

    3. Siehe TStringList::Count

    bis bald
    akari



  • Hallo

    Meine Lösung war halt Standard und nicht auf VCL gemünzt.

    chrische



  • 1.Vielen Dank für die Hilfe

    2.Klasse Forum

    3.Wenn ich es irgendwann mal kann helfe ich auch 😃



  • Um nur die Schlüssel einer Ini-Datei zu lesen (auch wenn das Gleichheitszeichen fehlt), gibt es die Methode ReadSection(). Und wenn man die Namen der Abschnitte nicht kennt, kann man sich diese mittels ReadSections() auslesen.



  • Ich habe ReadSections() probiert, aber das liest nur Sektionen und die sind in [] ansonten brachten alle Versuche keine Werte zurück.

    ReadSection() gibt alle Werte links vom = zurück, aber nur wenn dieses auch vorhanden ist.

    ReadSectionValues() gibt alle Werte rechts vom = zurück, aber auch nur wenn vorhanden.



  • Sorry, dann habe ich mich wohl mit ReadSection() vertan.
    Dann mußt du es wie oben beschrieben ausprogrammieren.



  • Ich mach das so:

    void __fastcall TIniInspectorForm::ShowIniFile(AnsiString AFileName)
    {
      AnsiString SName;
      TMemIniFile *IF;
      TTreeNode *SN;
      TTreeNode *KN;
      TStringList *SL=new TStringList;                         //SectionList erzeugen
      TStringList *KL=new TStringList;                         //KeyList erzeugen
      IF=new TMemIniFile(AFileName);                         //Ini- Datei Öffnen
      SB->SimpleText="Lese Sectionen";
      IF->ReadSections(SL);                                  //Section- Namen einlesen
      KeyList->Items->Clear();                               //TreeView löschen
      KeyList->Update();
      SectionCount->Caption=0;
      KeyCount->Caption=" KeyCount";
      for (int i=0;i<SL->Count;i++)                          //Alle Section- Namen
      {
        SectionCount->Caption=SectionCount->Caption.ToInt()+1;
        SectionCount->Update();
        SB->SimpleText=AnsiString("Lese Section ").operator+=(SL->Strings[i]);
        SN=KeyList->Items->Add(0,SL->Strings[i]);            //als Hauptknoten einfügen
        KeyList->Update();
    //      IF->ReadSection(SN->Text,KL);                        //Keys für Section lesen
        IF->ReadSectionValues(SN->Text,KL);                  //Keys und Values für Section lesen
        for (int j=0;j<KL->Count;j++)                        //Alle Key's
        {
          AnsiString AS;
          KN=KeyList->Items->AddChild(SN,KL->Strings[j]);    //Section- Knoten hinzufügen
    //        AS=IF->ReadString(SN->Text,KL->Strings[j],"-");    //Key- Value lesen
    //        KeyList->Items->AddChild(KN,AS);                   //Value in neuen Knoten
    //        KN->Text.operator+=(" = ").operator +=(AS);        //Key- Value anhaengen
    //        SB->SimpleText=AnsiString("Lese Schlüssel [").operator+=(SL->Strings[i]).operator+=("] ").operator+=(KL->Strings[j]).operator+=(" = ").operator+=(AS);
          SB->SimpleText=AnsiString("Lese Schlüssel [").operator+=(SL->Strings[i]).operator+=("] ").operator+=(KL->Strings[j]);
          KN->ImageIndex=1;
          KN->SelectedIndex=2;
        }
      }
      SectionCount->Caption=SectionCount->Caption.operator+=(" Sections");
      SectionCount->Update();
      SL->Clear();                                           //SectionList leeren
      IF->GetStrings(SL);                                    //Alle Zeilen einlesen
      delete IF;                                             //IniFile freigeben
      KeyList->Update();
      SName="[] ";
      for (int i=0;i<SL->Count;i++)                          //Alle Zeilen Testen
      {
        SB->SimpleText=AnsiString("Teste Zeile ").operator+=(SL->Strings[i]);
        if (SL->Strings[i].Length()==0)                      //Leerzeilen
        {  SL->Delete(i);                                    //entfernen
           i--;
        }
        else
        {
          if (SL->Strings[i][1]=='[')                        //SectionNamen
          { SName=SL->Strings[i];                            //Sectionname speichern
            SL->Delete(i);                                   //entfernen
            i--;
          }
          else
          { if (SL->Strings[i].AnsiPos("=")>0)               //gueltige Schluessel
            {  SL->Delete(i);                                //entfernen
              i--;
            }
            else
            {
              SL->Strings[i]=SName.operator+=(" ").operator+=(SL->Strings[i]);
            }
          }
        }
      }
      NoKeyList->Text=SL->Text;                              //Liste in Memo anzeigen
      SB->SimpleText=AnsiString("Einlesen beendet");
      delete KL;
      delete SL;
      KeyList->Invalidate();
      NoKeyList->Invalidate();
    }
    

    !!! Es wird direkt auf Komponenten des Formulars zugegriffen !!!
    Die müssen natürlich auch mit den Namen existieren.

    Die "ungültigen" Schlüssel kommen in ein Memo
    Die gültigen in ein TreeView

    Gruss
    Frank


Anmelden zum Antworten