2013-05-08 11 views
7

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 

Odpowiedz

5

Po zapoznania się s0, strumień jest w stanie EOF. Tak więc kolejny odczyt nie powiedzie się, chyba że stan EOF zostanie wyczyszczony. Zapisywanie do strumienia nie powoduje oczyszczenia stanu odczytu.


Edytuj, aby ukończyć odpowiedź. To zachowanie pochodzi z definicji eofbit z ios_base::iostate, która mówi, że stan strumienia będzie miał ustawiony ten bit, jeśli strumień znajduje się na końcu sekwencji wejściowej.

W pierwszej wersji programu, ponieważ stan EOF nie został wyczyszczony po pierwszym przeczytaniu w s0, ani drugi odczyt, ani trzeci odczyt nie powiedzie się. Tak więc, nieudany pierwszy odczyt pozostawia pusty, s1 pusty, a nieudany drugi odczyt pozostawia s0 unchahnged.

W drugiej wersji programu wyczyszczono ss po pierwszym przeczytaniu w s0, co pozwala na ponowne przeczytanie w s1, aby odnieść sukces. Jednak po drugim odczycie strumień jest ponownie w stanie EOF, więc trzeci odczyt kończy się niepowodzeniem. Pozostawia to niezmieniony numer s0.

+0

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

+1

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

Powiązane problemy