Implementierung von Getline so korrekt? Alternativen?
-
Hallo Ihr Lieben.
Ich nutze seit der "Umstellung" auf STL oft die Funktion getline also alternative zu der C-Funktion strtok.
Dabei duchsuche ich einen String nach bestimmten Zeichen und teile diesen dann entsprechend auf.Da sieht so aus:
std::istringstream st; st.clear(); st.str(""); st.str(com_pers); (............) zw_kurz=""; getline(st,zw_kurz,'#'); if(zw_kurz.empty())zw_kurz="??"; ptr_tapl[i].ptr_ma_tapl[u-5].t_kurz.append(zw_kurz); //Woplan getline(st,zw_fvor,'/'); if(zw_fvor.empty())zw_fvor="??"; ptr_tapl[i].ptr_ma_tapl[u-5].t_fehlv.append(zw_fvor); //Fehl Vormittag getline(st,zw_fnach,'#'); if(zw_fnach.empty())zw_fnach="??"; ptr_tapl[i].ptr_ma_tapl[u-5].t_fehln.append(zw_fnach); //Fehl Nachmittag getline(st,zw_erlaubt,'|'); if(zw_erlaubt.empty())zw_erlaubt="??"; ptr_tapl[i].ptr_ma_tapl[u-5].t_erlaubt.append(zw_erlaubt);Jetzt stellt sich mir die Frage ob diese implementierung so korrekt und anwendbar ist oder obs da etwas "besseres" gibt.
Es gibt ja noch string.find() welches ich auch oft benutze,aber getline ist geschmeidiger und ich brauche weniger Code.
Die Frage ist ob sich die Funktion so verwenden lässt.
Ich habe das so schon im produktiv Einsatz nur möchte ich Überraschungen vermeiden...Was meint Ihr dazu?
Grüße Mondmann
-
Also ich finde die string::find()-Familie allgemeiner verwendbar (vor allem, weil man dort auch aus mehrere Zeichen parallel suchen kann - find_first_of()). Aber der Ansatz sieht nicht schlecht aus.
(allerdings solltest du sicherstellen, daß alle Trennzeichen in der richtigen Reihenfolge im Eingabestring vorkommen)
PS:
str.clear();(der Stream wurde eine Zeile darüber neu erstellt, ist also garantiert "sauber") undstr.str("");(du überschreibst den Wert sofort mit den korrekten Daten) sind übrigens unnötig.
-
Alles klar.
Ja das ist unnötig, das sehe ich ein.
Normalerweise ist sichergestellt, daß die Zeichen in der richtigen Reihenfolge kommen.
Nur habe ich ab und zu dern falschen String am falschen Platz, weiß aber noch nicht woran es liegt.Ich sehe den Vorteil in getline, daß ich mir Code sparen kann.
getline macht an der Stelle des zuletzt gefundenen Zeichens weiter und sucht das nächste.Mit find() mus ich mir immer die Position merken und ab dieser weitersuchen.
Geht auch,aber mit mehr Code...Wie meinst du das mit "mehrere Zeichen Parallel"?
Noch etwas anderes.
Gibt es denn eine Funktion mit der ich die Anzahl eines bestimmten Zeichens bestimmen kann in einem std::string?
Bisher mache ich das immer in einer for-Schleife.
-
Mondmann schrieb:
Nur habe ich ab und zu dern falschen String am falschen Platz, weiß aber noch nicht woran es liegt.
Debugging?
Ich sehe den Vorteil in getline, daß ich mir Code sparen kann.
getline macht an der Stelle des zuletzt gefundenen Zeichens weiter und sucht das nächste.Mit find() mus ich mir immer die Position merken und ab dieser weitersuchen.
Geht auch,aber mit mehr Code...Klar, das ist ein eindeutiger Vorteil.
Wie meinst du das mit "mehrere Zeichen Parallel"?
Mit getline() kannst du nur ein einziges Trennzeichen für den nächsten Teilstring angeben, find_first_of() kannst du mehrere Zeichen übergeben und er liefert das erste davon, das er findet (z.B. findet
str.find_first_of(" \t\n")die Position des ersten Whitespace. Wenn ich strtok() nachbauen müsste, würde ich wohl gerade deswegen lieber die String-Methoden nutzen und in einer eigenen Hilfsklasse unterbringen://ungetestet class string_splitter { string m_data; size_t m_pos; public: string_splitter(const string& data) : m_data(data),m_pos(0) {} string operator()(const string& delim) { size_t start = m_pos, ende = m_data.find_first_of(delim,m_pos); m_pos = data.find_first_not_of(delim,ende); return m_data.substr(start,ende); } }; ... string_splitter split(com_pers); zw_kurz = split("#"); if(zw_kurz.empty())zw_kurz="??"; ptr_tapl[i].ptr_ma_tapl[u-5].t_kurz.append(zw_kurz); //Woplan ...
-
Klar debugging..schon dabei.
Danke für Dein Beispiel, werds mir mal genauer ansehen.
Mein erstes Beispiel ist in einer for-Schleife und wird mehrere hundert Male durchlaufen.
Den String den ich durchsuche ist, je nachdem, 10K groß!
Wäre Dein Beispiel dann auch noch verwendbar?
Die Zeichenabfolge ist immer gleich und die Teilstrings werden Zwischengespeichert...Die Funktion count() habe ich in der msdn gefunden..nur ob die schneller ist als die for schleife?