2010-09-21 13 views
6

Chciałem eksperymentować z stringstream dla zadania, ale jestem trochę zdezorientowany, jak to działa. Zrobiłem szybkie wyszukiwanie, ale nie znalazłem niczego, co mogłoby odpowiedzieć na moje pytanie.jak odczytać stringstream z dynamicznym rozmiarem?

Powiedz, że mam strumień o rozmiarze dynamicznym, skąd mam wiedzieć, kiedy przerwać zapisywanie do zmiennej?

string var = "2 ++ asdf 3 * c"; 
stringstream ss; 

ss << var; 

while(ss){ 
    ss >> var; 
    cout << var << endl; 
} 

i mój wynik byłby:

2 
++ 
asdf 
3 
* 
c 
c 

Nie jestem pewien, dlaczego mam to dodatkową 'c' na końcu, zwłaszcza _M_in_cur = 0x1001000d7 ""

+0

Fakt, że jest to stringstream, nie zmienia wiele z niczego - czytasz z niego tak, jakbyś był dowolnym innym strumieniem. –

Odpowiedz

17

Dostajesz dodatkowe c na końcu, ponieważ nie można sprawdzić, czy strumień jest nadal dobry po wykonaniu ekstrakcji:

while (ss)  // test if stream is good 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 

Należy przetestować stan strumienia między wykonaniem ekstrakcji a użyciem wyniku. Zwykle odbywa się to przez prowadzenie ekstrakcji w stanie pętli:

while (ss >> var) // attempt extraction then test if stream is good 
{ 
    cout << var; // use result of extraction 
} 
+0

Dzięki, myślę, że moje pytanie powinno być sformułowane jako sprawdzanie stanu strumienia. –

+0

@ thomast.sang zaakceptować swoją odpowiedź. – gsamaras

-1

Istnieje również dobre działanie członu(), który sprawdza, czy strumień może być używana do operacji We/Wy. Tak więc za pomocą tego powyższy kod może zostać zmieniony w

while(ss.good()) // check if the stream can be used for io 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 
+1

Jest to nadal niepoprawne w ogólnym przypadku: jeśli próbujesz wyodrębnić 'int', a następne dostępne znaki w buforze nie mogą być odczytane jako' int', ekstrakcja się nie powiedzie. –

0

Kontrola while(ss) warunek w swoim kod sprawdza czy ostatni odczyt ze strumienia był udany, czy nie. Jednak ta weryfikacja powróci do wartości true nawet po przeczytaniu ostatniego słowa w ciągu znaków. Tylko następna ekstrakcja ss >> var w kodzie spowoduje, że warunek ten będzie fałszywy, ponieważ koniec strumienia został osiągnięty & nie ma nic do wyodrębnienia do zmiennej var. Z tego powodu na końcu dostajesz dodatkowe "c". Możesz to wyeliminować, zmieniając kod zgodnie z sugestią Jamesa McNellisa.

Powiązane problemy