Wspólny kawałek kodu używam do prostego podziału ciąg wygląda następująco:W jaki sposób std :: stringstream może ustawić bit fail/bad?
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;
}
Ktoś wspomniał, że będzie cicho „jaskółka” błędy występujące w std::getline
. I oczywiście zgadzam się, że tak jest. Ale przyszło mi do głowy, co może pójść nie tak w praktyce, że będę musiał się martwić. w zasadzie to wszystko sprowadza się do tego:
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;
}
stringstream
jest wspierany przez string
, więc nie musimy się martwić o jakichkolwiek problemów związanych z czytania z pliku. Od getline
nie odbywa się tutaj żadna konwersja typu, dopóki nie zobaczy separatora linii lub EOF
. Nie możemy więc uzyskać żadnego z błędów, o które musi się martwić coś w rodzaju boost::lexical_cast
.
Po prostu nie mogę wymyślić niczego poza tym, że nie mogę przydzielić wystarczającej ilości pamięci, która mogłaby pójść źle, ale to po prostu rzuci std::bad_alloc
na długo przed tym, zanim std::getline
będzie miało miejsce. czego mi brakuje?
Niepoprawne jest zwracanie odwołania do lokalnego. – UncleBens
Dobry połów, chociaż nie chciałem zwrócić odniesienia do lokalnego, jest to przykładowy przykład demonstrujący podstawy pytania: –
Ciąg 'stringstream' jest wspierany przez' string' tylko jeśli nie zadzwoniłeś 'rdbuf (otherstreambuf)'. –