Bir stringstream değişkenini nasıl temizlersiniz?


Yanıtlar:


771

Tüm standart kitaplık türleri için üye işlevi empty()bir komut değil sorgudur, yani "boş musunuz?" "lütfen içeriklerinizi atın".

clear()Üye işlevi miras iosve bir dosya akışı için hata durumu grubu varsa, örneğin akımı, hata durumunu temizlemek için kullanılır eofbit(sonu dosyası), o zaman çağrı clear()için hata durumu geri koyacaktır goodbit(herhangi bir hata) .

A'nın içeriğini temizlemek için stringstreamşunları kullanarak:

m.str("");

aşağıdakileri kullanırken doğru:

m.str(std::string());

Eğer yürütmesini kaçının, çünkü teknik olarak daha verimlidir std::stringalan kurucuya const char*. Ama bu gün herhangi bir derleyici her iki durumda da aynı kodu üretmek mümkün olmalıdır - bu yüzden sadece daha okunabilir ne ile gitmek istiyorum.


105
"Clear ()" kısmını unutursanız, işte burada olacaksınız. stackoverflow.com/q/2848087/635549
galath

8
@KshitijBanerjee Bence C ++ m.str () ve m.str ("") iki farklı işlevdir. m.str () herhangi bir parametre beklemeyen bir işlevi çağırırken, m.str ("") bir const char * parametresini kabul eden işlevi çağırır. m.str () , dizeyi döndüren bir get fonksiyonu olarak , m.str ("") ise set fonksiyonu olarak uygulanmış olabilir .
Dinesh PR

4
Galath'ın dediği gibi m.clear (); m.str ("") ek olarak; Aksi takdirde, bir noktada dize akışını boş bir dize ile doldurursanız sorun yaşayabilirsiniz.
Sputnik

1
@anthropod Evet, geçen yıl oldu. O zamandan beri çalıştım.
James

1
Oh çocuk bu sezgisel. Tıpkı C ++ ile ilgili her şey gibi!
güneşli ay

47

Hata durumunu temizleyebilir ve dize akışını tek bir satırda boşaltabilirsiniz

std::stringstream().swap(m); // swap m with a default constructed stringstream

Bu, m'yi varsayılan yapılandırılmış duruma etkin bir şekilde sıfırlar


3
Bu, diğer tüm cevaplara kıyasla bunu yapmanın en etkili ve en zarif yoludur. Ancak, std :: stringstream :: swap bir c ++ 11 özelliğidir ve bu çözüm önceki c ++ 11 derleyicileri için çalışmaz.
101010

4
Özellik hala GNU g ++ v4.8'de eksik, bkz. Stackoverflow.com/questions/24429441/…
Joachim W

7
@ 101010: Takas, taşıma atamasından nasıl daha iyi?
Tekilleştirici

2
@AsetD: Bu istisna olmasa bile, varsayılan olarak oluşturulmuş geçici durumu unuttunuz mu?
Tekilleştirici

3
Bu düşük verimlidir. Orijinal ss'yi yeniden kullanmak istediğimde. Benim için bir boş takas ediyor.
Zhang


33

Bu, derleyiciden bağımsız olarak en güvenilir yol olmalıdır:

m=std::stringstream();

2
Bence bu daha iyi çünkü m.str (""); ne olursa olsun benim stringstream o boş değeri ile sıkışmış neden oldu. Ama bu kullanarak bunu sorun yok
gelatine1

3
Aynı problemle karşılaştım, benim mm.clear(); mm.str("");için hile yaptı. (C ++ 11 yok, takas daha iyi olurdu).
hochl

1
@hochl: Neden swaphareket atamasından daha iyi olur?
Tekilleştirici

4
Her durum için iyi değil. Mm.str ("") her seferinde ara belleği yeniden tahsis eder.
Shital Shah

3
Bir dize akışı nesnesini yıkamak için birincil kullanım durumum, dize akışının gereksiz şekilde örneklenmesini önlemek için bir iş parçacığı yerel dize akışı nesnesini tutuyor - yeni bir dize akışı nesnesinin başlatılması genel yerel nesneyi kopyalıyor - teorik olarak bu hızlı ve sadece bir atomik artışı artırıyor, ancak uğraştığım eşzamanlılık düzeyinde genellikle sakat.
39'da Spacemoose

12

Ben her zaman kapsama giriyorum:

{
    std::stringstream ss;
    ss << "what";
}

{
    std::stringstream ss;
    ss << "the";
}

{
    std::stringstream ss;
    ss << "heck";
}

1
Bu temizlemek daha iyistringstream?
Robur_131

11

benim 2 sent:

Bu benim için xcode ve dev-c ++ gibi görünüyordu, ben bir kullanıcının isteğine göre tekrar tekrar yürütülürse kod ilk kez Tamam çalışacak bir dize akışı değişkeni dolduracak bir menü şeklinde bir program vardı çalıştırır, ancak kullanıcı aynı kodu bir daha çalıştırdığında dize akışını temizlemez. ancak aşağıdaki iki kod satırı, string değişkenini doldurmadan önce stringstream değişkenini her seferinde temizledi. (2 saatlik deneme yanılma ve google aramaları), btw, her satırı kendi başına kullanmak hile yapmaz.

//clear the stringstream variable

sstm.str("");
sstm.clear();

//fill up the streamstream variable
sstm << "crap" << "morecrap";

-1

Bu kavramsal bir problem.

Stringstream bir akıştır, bu nedenle yineleyicileri ileridir, geri dönemez. Bir çıkış dizesi akışında, diğer çıkış akışlarında olduğu gibi yeniden başlatmak için bir floş () öğesine ihtiyacınız vardır.


2
en.cppreference.com/w/cpp/io/basic_ostream/flush flush, ilişkili olduğu depolama cihazı ile senkronize edilir. Bu aynı yeniden başlatma değil.
Daha net

-12

Bunlar gnu c ++ dize akışındaki verileri atmaz

    m.str("");
    m.str() = "";
    m.str(std::string());

Aşağıdakiler benim için stringstream'i boşaltıyor:

    m.str().clear();

7
Bunun işe yarayacağından emin değilim, aynı nedenlerle bernhardrusch'un işe yaramayacağı. .Str () işlevi bir kopya döndürür ve kopyayı temizlemek hiçbir şey yapmaz.
Verdagon

1
Bu çözüm, Microsoft Visual C ++ için çalışmaz.
Zak

Yanlış. Clear, akışın kendisinde değil, akıştan döndürülen dize üzerinde çalışır.
Joey Carson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.