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 TreeViewGruss
Frank