Napisałem krótki program testowy, aby sprawdzić, czy mogę dodać ciąg do ciągu łańcuchowego.Dlaczego muszę wyczyścić tutaj std :: stringstream?
W pierwszej wersji otrzymałem Output1 i naprawdę nie rozumiem, dlaczego s1 pozostaje puste. Dowiedziałem się, że muszę zrobić ss.clear(), a następnie uzyskać oczekiwany wynik w Output2. Czy ktoś może wyjaśnić, dlaczego nie działa bez wyraźnego? Spodziewałbym się, że jeśli wielokrotnie wprowadzę liczby i sprowadzę je z powrotem na ciąg, powinienem zawsze uzyskać numer. Nie byłem pewien, czy liczba zostanie dodana, ale to nie ma znaczenia dla tego przykładu.
Tutaj: http://www.cplusplus.com/reference/sstream/stringstream/ mówi, że mogę użyć dowolnej operacji, i nie ma ograniczeń ani wymagań, aby zresetować ciąg, widziałem. Też nie rozumiem, dlaczego potem otrzymuję wyjście bez ss.clear() pomiędzy.
Jestem także nieco zaskoczony, że s0 pozostaje taki sam później. Czy strumień nie zastępuje ani nie resetuje łańcucha, jeśli ma już treść?
Używam gcc 3.4.4 z cygwin.
int main()
{
std::string s0;
std::string s1;
int n = 1;
std::stringstream ss;
ss << n;
ss >> s0;
cout << "S0:" << s0 << endl;
ss.clear(); <-- If I remove this, then s1 stays empty.
n = 2;
ss << n;
ss >> s1;
cout << "S1:" << s1 << endl;
ss << n;
ss >> s0;
cout << "S0_2:" << s0 << endl; <-- Why is s0 still 1?
}
Output1:
S0:1
S1:
S0_2:1
OUTPUT2:
S0:1
S1:2
S0_2:1
Dzięki. Przypuszczam, że to gdzieś dokument? Zastanawiam się, dlaczego nie jest to wspomniane na stronie. Myślę, że byłoby to miłym pułapką, gdy używamy stringów w pętli. :) – Devolus
Pochodzi z definicji 'eofbit', która polega na tym, że powinna być ustawiona, jeśli strumień znajduje się na końcu sekwencji wejściowej. Staje się to prawdą po pierwszym przeczytaniu. – jxh