Próbowałem już kilku rzeczy,
std::stringstream m;
m.empty();
m.clear();
oba nie działają.
Próbowałem już kilku rzeczy,
std::stringstream m;
m.empty();
m.clear();
oba nie działają.
Odpowiedzi:
Dla wszystkich standardowych typów bibliotek funkcja członka empty()
jest zapytaniem, a nie poleceniem, tzn. Oznacza „czy jesteś pusty?” nie „wyrzuć swoją zawartość”.
Funkcja clear()
członka jest dziedziczona ios
i używana do kasowania stanu błędu strumienia, np. Jeśli w strumieniu pliku ustawiono stan błędu na eofbit
(koniec pliku), wówczas wywołanie clear()
spowoduje przywrócenie stanu błędu do goodbit
(brak błędu) .
Aby wyczyścić zawartość a stringstream
, używając:
m.str("");
jest poprawne, chociaż używa:
m.str(std::string());
jest technicznie bardziej wydajny, ponieważ unikasz wywoływania std::string
konstruktora const char*
. Ale każdy kompilator w dzisiejszych czasach powinien być w stanie wygenerować ten sam kod w obu przypadkach - więc wybrałbym coś, co jest bardziej czytelne.
Możesz usunąć stan błędu i opróżnić ciąg znaków wszystkie w jednym wierszu
std::stringstream().swap(m); // swap m with a default constructed stringstream
To skutecznie resetuje m do domyślnego stanu skonstruowanego
m.str("");
wydaje się działać.
Powinien to być najbardziej niezawodny sposób niezależnie od kompilatora:
m=std::stringstream();
mm.clear(); mm.str("");
załatwiłem sprawę. (bez C ++ 11, w przeciwnym razie lepiej byłoby swap).
swap
lepsze niż przypisanie do ruchu?
moje 2 centy:
wydawało mi się, że działa to dla mnie w xcode i dev-c ++, miałem program w formie menu, który jeśli zostanie wykonany iteracyjnie zgodnie z żądaniem użytkownika, wypełni zmienną typu stringstream, która zadziała ok za pierwszym razem uruchom, ale nie wyczyści strumienia znaków następnym razem, gdy użytkownik uruchomi ten sam kod. ale dwa wiersze kodu poniżej ostatecznie wyczyściły zmienną stringstream za każdym razem przed wypełnieniem zmiennej string. (2 godziny prób i błędów oraz wyszukiwań w Google), przy okazji, użycie każdej linii osobno nie załatwi sprawy.
//clear the stringstream variable
sstm.str("");
sstm.clear();
//fill up the streamstream variable
sstm << "crap" << "morecrap";
To problem koncepcyjny.
Strumień ciągu jest strumieniem, więc jego iteratory są przesyłane do przodu i nie mogą zwrócić. W wyjściowym łańcuchu znaków potrzebujesz flush (), aby zainicjalizować go, jak w każdym innym strumieniu wyjściowym.
Nie odrzucają one danych ze strumienia w gnu c ++
m.str("");
m.str() = "";
m.str(std::string());
Poniższe polecenie opróżnia dla mnie ciąg znaków:
m.str().clear();