Auftrennen von string an Zeichen
-
Hallo,
ich möchte einen std::string am _ersten_ Vorkommen des Gleichheitszeichens auftrennen und die resultierenden Teile in zwei char-Arrays schreiben.
Habe dazu folgenden Code geschrieben, der auch funktioniert:
while(std::getline(f,l)) { char key[TI_SYSCFG_MAX_KEY_LEN]; char val[TI_SYSCFG_MAX_VAL_LEN]; int pos_eq = l.find_first_of('='); if(pos_eq == std::string::npos) continue; // Copy configuration key memcpy(key, l.c_str(), pos_eq); key[pos_eq] = '\0'; // Copy configuration value strcpy(val, l.c_str() + pos_eq + 1); // Test std::cout << key << std::endl; std::cout << val << std::endl; }Kann man das so lassen? Ist das "hübsches" C++? Lässt sich das performancetechnisch optimieren?
Thx
-
Warum char-Arrays? Warum auftrennen? Was, wenn die Zahl der Zeichen zu groß ist oder kein Gleichheitszeichen drin ist? Kontext?
-
Was, wenn die Zahl der Zeichen zu groß ist
Ja richtig.
@auftrenni :
Wenn dein Wert, welcher du in val speichern möchtest größer ist als TI_SYSCFG_MAX_VAL_LEN Zeichen, knallt es. Nicht schön.
-
Naja es sollen key-Value Paare in eine HashTable-Datenstruktur überführt werden. Ich wollte die char-Arrays (key, value) dann entsprechend dort ablegen, um auf Konfigwerte effizient zugreifen zu können.
Wenn kein = Zeichen vorhanden, wird doch mit der Abfrage im Code die Zeile ignoriert...
-
Yep, ich frag noch Position von = (Prüfung Länge Key) und String-Länge minus Position von = ab (Prüfung Länge Value), danke.
-
Willst du dir denn nicht mehr Mühe geben beim Parsen? Was, wenn in der Zeile
value = 5steht? Dann speicherst du "value " und " 5" ab. Gewünscht? Ich würde beim Parsen eher nicht so extrem auf Geschwindigkeit optimieren. Jedenfalls nicht auf Kosten einer intuitiven Programmsemantik.
Ansonsten winzige Detailverbesserungen:
- data() statt c_str() könnte auf einigen Implementierungen ein paar Takte schneller sein.
- Ebenso memcpy statt strcpy. Die Länge ist schließlich bekannt
- Sieht derzeit so aus, als ob du die Arrays später noch einmal kopieren müsstest. Könnte man sicher geschickter machen. Hier wäre sogar ein std::string möglicherweise flotter, da er gemoved werden könnte.
- A propos Ressourcenwiederverwertung: Du könntest mit std::string sogar den gelesenen String weiterverwenden, wenn du für den key einfach den String kürzt und dann in die Datenstruktur move'st.Sieht insgesamt sehr nach der berühmten premature optimization aus. Was ist denn der typische erwartete Anwendungsfall, was Länge der Zeichenketten und Anzahl der Einträge angeht? Wie oft wird zugegriffen?
-
SeppJ schrieb:
- data() statt c_str() könnte auf einigen Implementierungen ein paar Takte schneller sein.
Ab C++11 müssen die Funktionen exakt das selbe machen.
-
SeppJ schrieb:
Willst du dir denn nicht mehr Mühe geben beim Parsen? Was, wenn in der Zeile
value = 5steht? Dann speicherst du "value " und " 5" ab. Gewünscht? Ich würde beim Parsen eher nicht so extrem auf Geschwindigkeit optimieren.
Das muss auf einem eingebettetem System mit wenig Speicher laufen. Sonst hätte ich das auf jeden Fall aufgebohrt.
-
SeppJ schrieb:
Willst du dir denn nicht mehr Mühe geben beim Parsen? Was, wenn in der Zeile
value = 5steht? Dann speicherst du "value " und " 5" ab. Gewünscht? Ich würde beim Parsen eher nicht so extrem auf Geschwindigkeit optimieren. Jedenfalls nicht auf Kosten einer intuitiven Programmsemantik.
Ansonsten winzige Detailverbesserungen:
- data() statt c_str() könnte auf einigen Implementierungen ein paar Takte schneller sein.
- Ebenso memcpy statt strcpy. Die Länge ist schließlich bekannt
- Sieht derzeit so aus, als ob du die Arrays später noch einmal kopieren müsstest. Könnte man sicher geschickter machen. Hier wäre sogar ein std::string möglicherweise flotter, da er gemoved werden könnte.
- A propos Ressourcenwiederverwertung: Du könntest mit std::string sogar den gelesenen String weiterverwenden, wenn du für den key einfach den String kürzt und dann in die Datenstruktur move'st.Sieht insgesamt sehr nach der berühmten premature optimization aus. Was ist denn der typische erwartete Anwendungsfall, was Länge der Zeichenketten und Anzahl der Einträge angeht? Wie oft wird zugegriffen?
Länge Zeichenkette ist eigentlich stets unter 256.
Zugriffe nur zu Beginn bei Initialisierung, vielleicht 30 Stück wenns hochkommt.Danke für deine Tipps, ich werde nun memcpy einsetzen und mir nochmal über die char-Buffer Gedanekn machen.
-
auftrenni schrieb:
Das muss auf einem eingebettetem System mit wenig Speicher laufen. Sonst hätte ich das auf jeden Fall aufgebohrt.
Das heißt, du verschwendest lieber für jeden Eintrag (256-Länge) Zeichen anstatt genau passende Strings (oder vielleicht eine eigene dynamische Klasse mit nur zwei Pointern statt drei) zu nehmen?
Ich verstehe auch nicht, was die Speichermenge mit meinem Vorschlag zu tun hat, der in-place gewesen wäre. Es war vor allen eine semantische Frage.