Zwei TStringList() in eine Datei speichern!



  • Wie man eine Liste in eine Datei mit SaveToFile() speichert ist klar.
    Ich möchte zwei Listen gleichzeitig in eine Datei abspeichern. Mann kann die Strings in eine Liste packen und abspeichern, aber ich bekomme Probleme beim laden der Datei, weil es ist eben nicht bekannt was für Anzahl der Strings jede Liste hat. Bei Ini datei es ist mit [sections] getrennt, kann man jede Section aus lesen, aber die Datei soll keine Ini sein.



  • Du musst dir dafür schon selber eine Funktion schreiben. Hier wäre es wohl am besten Standard-C++ zu bemühen.

    struct twostrings
    {
      AnsiString str1, str2;
    // noch Konstruktor etc. einfügen
    };
    // am besten hier noch operator<< und operator>> überschreiben
    std::vector<twostrings> vect; // Hier zur Aufbewahrung
    //speichern
    size_t count(vect.size());
    std::ofstream out("test.txt");
    for( size_t i=0; i<count; ++i)
    {
      out << vect[i].str1 << " " << str2 << "\n";
    }
    


  • Andere Möglichkeit:
    Du packst beide StringListen in eine und speicherst diese dann ab.
    Musst dir aber zuerst noch die Länge der ersten StringListe merken.
    Diesen Wert packst du ans Ende der StringListe.



  • Oder...

    Du fügst am Ende der ersten SL ein Delimmerzeichen ein.
    Hängst die 2. SL an. Speicherst Sie ab.

    Beim öffnen lädst Du die Datei in eine SL. Suchst dann nach dem
    Delimmerzeichen. Nimmst zeile 0 -> Pos(DELIMMER) - 1 kopierst das
    in die zweite SL. Dann aus der ersten SL von Zeile 0 -> POS(DELIMMER)
    löschen -> bing fertig



  • DELIMMER = Dilemma 😕

    Delemiter
    Das dürfte aber mal ziemlich unverhältnismäßigen Ressourcenverbrauch darstellen.
    Je nach größe der TStringListen.



  • Hmm wieso die Daten werden sowieso als ASCII in die Datei geschrieben und
    die 2 StringListen existieren doch sowieso schon. Die Größe der Inhalte der Listen
    bleibt permanent gleich nur das beide SL durch eine geladen werden und dann aufgeteilt. Ich glaube das 1 Byte des Trennzeichen + 1Byte des \n machen den Kohl nun nicht fett oder?



  • Nein, es geht da um die Ressourcen, die du durch suchen und kopieren verbrätst.



  • Ich glaube wenn die SL keine 100MB enthält brauch man sich da sicherlich nicht
    drüber unterhalten. Die Zeit sind dann doch vorbei...

    Trotzdem sieht die rein C Variante sicherlich eleganter aus 😉

    Durch die Problemstellung jedoch finde ich das Prinzip über ein Trennzeichen logischer.

    Ansatz #3: Setzt als 1. Zeile die Anzahl der Zeilen und trenne so. Spart man sich die Schleife zum suchen
    des Trennzeichen.



  • Das geht ganz einfach mit TFileStream und TStringList::SaveToStream().



  • Was da jetzt genau das schnellste Verfahren ist kann man wohl nur durch Tests herausfinden, denke aber nicht dass es hier um Dimensionen geht bei denen es Probleme geben könnte.

    Trotzdem würde ich das von audacia genannte Verfahren bevorzugen.
    Anstatt ein Trennzeichen zu verwenden würde ich aber einfach in der ersten Zeile der Datei speichern wieviele Zeilen zur ersten Liste gehören und das beim Laden entsprechend auseinanderfriemeln.


Anmelden zum Antworten