Abspeichern eines std::vectors in Textfile
-
Hallo,
ich habe das Problem, in ein Textfile Zeile für Zeile Integer Werte von Vektoren zu speichern. Das ganze soll am Ende mal so aussehen:
Reihenfolge1: | Reihe : 20 56 87 99 11 | Nummer : 1 2 4 3 8 | Lfd. : 33 300 20 11 44 ______________________________________________ Reihenfolge2: | Reihe : 21 55 24 44 69 73 91 | Nummer : 7 11 61 12 52 48 62 | Lfd : 17 150 320 2 21 80 99 ______________________________________________Sollte ich dafür eine TStringList verwenden und dann der Reihe nach die Werte in die entsprechenden Zeilen schreiben. Aber wie bekomme ich aus dem std::vector die Zahlen extrahiert. Oder muss ich für jedes Element einen Aufruf starten?
Kann ich denn auch den Abstand zwischen zwei Zahlen bestimmen? Am besten für alle einheitlich, damit alles schön untereinander rechtsbündig steht. s.o.
Danke Leute für jede Antwort
-
TStringList ist die einfachste Methode, könntest aber auch mit FILE* rumhantieren.
Wenn du nicht vorher weißt wie groß die größte Zahl ist müsstest du das erstmal bestimmen.
Siehe dazu da:
hierWenn du das weißt ist es eigentlich kein großes Problem mehr.
Siehe dazu:
StringOfChar
IntToStr
TStringList::Add
TStrings::SaveToFile
-
Hallo,
und danke für deine Antwort.
Ich verstehe nicht ganz was du meinst. Warum benötige ich das größte Element des Vektors?
Mein Problem ist eher, wie ich die Zeilen als String zusammenfassen soll, da TStringList::Add ja nur AnsiStrings annimmt. Ich muss doch dann Zeile für Zeile eintragen. Oder verstehe ich da was falsch und stehe gewaltig auf dem Schlauch?
Auch mit der gewünschten Formatierung bin ich ein bisschen überfragt.Danke
-
Hallo
rean meinte du must herausfinden welche der Zahlen im vector die meisten Dezimalstellen hat, damit du bestimmen kannst wie viele Stellen du für die Zahlen insgesamt einräumen must. Wenn du natürlich aufgrund des Programmflußes davon ausgehen kannst das die Zahlen nie mehr als die im Beispiel gezeigten 3 Stellen haben werden kannst du das ganze auch überspringen.
Ja du must die einzelnen Zeilen manuell zusammensetzen. Zahlen kannst du mittelns der Funktion IntToStr umwandeln.
bis bald
akari
-
akari hat deine neuerliche Frage ja schon beantwortet.
Wie akari schon gesagt hat kannst du den Schritt mit dem maximalen Element weglassen wenn du vorher schon weißt dass deine Zahlen z.B. maximal 3 Stellen haben können.
Falls du das nicht sicher sagen kannst und auch negative Zahlen vorkommen können wäre auch eine Suche nach dem minimalen Element ratsam weil dies ja länger sein könnte, Beispiel:
maximales Element +1
minimales Element -298737373
In dem Beispiel würde es dir die Formatierung natürlich ganz schön zerschießen.Ein kleiner Denkanstoß:
int max_length = 3; //entweder bestimmen oder Wert vorgeben TStringList *list = new TStringList(); list->Add("Das ist ein Beispiel"); AnsiString tempstr = "Was du halt am Anfang da haben willst"; for(int i=0; i<dein_vector.size(); i++) { int length = /*Stringlänge des aktuellen Elements bestimmen, siehe: IntToStr, AnsiString::Length(), vector::[]*/; tempstr += /* Die nötigen Leerzeichen vorschieben, siehe: StringOfChar (Hinweis: max_length - length) */; tempstr += /*Das Element hinzufügen, siehe: IntToStr, vector::[]*/; } list->Add(tempstr); //tempstr zur list hinzufügen //list abspeichernViel Spaß
-
Okay danke für eure Hilfe.
Die Zahlen in den verschiedenen Vektoren sind natürliche Zahlen mit bekannter maximaler Länge.
Ich hätte vielleicht gedacht, dass man das ganze einfacher abspeichern kann als jedes Element eines Vektors einzeln zu extrahieren und mit der Länge den Abstand zu bestimmen.
Dann werde ich das mal so ausprobieren wie rean es vorgeschlagen hat.
Danke
-
Afaik wäre es schon möglich den vector direkt rauszuschreiben.
Dann aber halt nicht in einem Stringformat wie von dir gewünscht sondern binär.[EDIT]
Wenn du den Code fertig hast kannst du ihn ja hier posten und wir schauen nochmal drüber ob man daran etwas optimieren kann.
Diese Methode sollte aber eigentlich gute Ergebnisse bei akzeptabler Laufzeit liefern.