2010-09-21 42 views
6

Bir ödev için stringstream ile denemek istedim, ama nasıl çalıştığına biraz kafam karıştı. Hızlı bir arama yaptım ama soruma cevap verecek bir şey bulamadım.Dinamik büyüklükte stringstream nasıl okunmalı?

Dinamik bir boyuta sahip bir akışım var mı, değişkene ne zaman yazmayı keseceğimi nasıl bilebilirim?

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

ss << var; 

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

ve benim çıkış olacaktır: Ben olsun neden

2 
++ 
asdf 
3 
* 
c 
c 

emin değilim özellikle _M_in_cur = 0x1001000d7 beri sonunda fazladan 'c', "" Sen almak

+0

Bir stringstream aslında bir şey çok değişmez - başka bir dere yapar gibi ondan okudum. –

cevap

17

o Ekstra c sonunda, ayıklama işlemini gerçekleştirdikten sonra akışının hala iyi olup olmadığını sınamanız çünkü

Ekstraksiyonu gerçekleştirdiğinizde ve sonucu kullandığınızda, akış durumunu sınamanız gerekir. Tipik olarak, bu döngü durumunda ekstraksiyon gerçekleştirerek yapılır:

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

Teşekkürler, sanırım sorum, akışın durumunu nasıl kontrol edeceğimiz hakkında bir cümle oluşturmuş olmalı. –

+0

@ thomast.sang cevabını kabul etti. – gsamaras

-1

akışı I/O işlemleri için kullanılabilir, eğer test üye fonksiyon iyi() de bulunmaktadır. akışından son okuma başarılı olup olmadığını Yani bu kullanarak yukarıdaki kodu kod çekleri

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

Bu hala genel durumda yanlıştır: bir "int" ayıklamak için çalışıyorsanız ve arabellekte bir sonraki kullanılabilir karakterler bir "int" olarak okunamaz, ayıklama başarısız olur. –

0

while(ss) koşul denetimi içine değiştirilebilir. Ancak, bu kontrol dizinizdeki son kelimeyi okurken bile gerçek geri dönecektir. Kodunuzdaki ss >> var kodunun sadece bir sonraki çıktısı, akışın sonuna & ulaşıldığı için bu koşulu yanlış hale getirecektir. Sonunda ekstra bir 'c' almanızın nedeni budur. James McNellis'in önerdiği gibi kodunuzu değiştirerek bunu ortadan kaldırabilirsiniz.

İlgili konular