Ein gemeinsames Stück Code, den ich für einfachen String Splitting verwenden sieht wie folgt aus:Ways std :: stringstream kann fail/bad bit setzen?
inline std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
Jemand erwähnte, dass dies leise „schlucken“ Fehler in std::getline
auftreten. Und natürlich stimme ich zu, dass das der Fall ist. Aber es kam mir in den Sinn, was könnte hier schief gehen in der Praxis, dass ich mir Sorgen machen müsste. im Grunde ist es läuft alles auf diese nach unten:
inline std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
if(/* what error can I catch here? */) {
// *** How did we get here!? ***
}
return elems;
}
A stringstream
wird von einem string
gesichert, so dass wir nicht über keine der Probleme mit dem Lesen aus einer Datei zugeordnet kümmern. Hier findet keine Typumwandlung statt, da getline
einfach gelesen wird, bis der Linienbegrenzer oder EOF
angezeigt wird. So können wir keine der Fehler bekommen, über die sich etwas wie boost::lexical_cast
Sorgen machen muss.
Ich kann einfach nicht an etwas denken, abgesehen davon, dass ich nicht genügend Speicher zuordnen kann, der schief gehen könnte, aber das wird einfach einen std::bad_alloc
werfen, bevor die std::getline
überhaupt stattfindet. Was vermisse ich?
Was ist falsch ist die Rückgabe einer Referenz auf eine lokale. – UncleBens
Guter Fang, obwohl ich nicht gemeint habe, einen Verweis auf einen lokalen zurückzugeben, ist dies ein reduziertes Beispiel, um die Grundlagen der Frage zu demonstrieren –
Ein 'stringstream' wird nur dann von einem' string' unterstützt, wenn Sie nicht aufgerufen haben 'rdbuf (othertreambuf)'. –