2012-07-12 5 views
5

Powiel możliwe:
How to reuse an ostringstream?Jak usunąć instancję std :: ostringstream, aby można ją było ponownie wykorzystać?

Używam std::ostringstream przekonwertować float i int wartości ciągów, ale nie mogę znaleźć w każdym razie na ponowne wystąpienie. Aby zilustrować, co mam na myśli tutaj jest następujący wraz z metodami, które starałem się użyć, aby wyczyścić strumień

#include <iostream> 
#include <sstream> 
using namespace std; 

int main() { 
    ostringstream stream; 
    stream << "Test"; 
    cout << stream.str() << endl; 
    stream.flush();     
    stream << "----"; 
    cout << stream.str() << endl; 
    stream.clear(); 
    stream << "****"; 
    cout << stream.str() << endl; 
    return 0; 
} 

generuje moc

Test 
Test---- 
Test----**** 

To daje mi problem, ponieważ mam do utworzyć wiele wystąpień z ostringstream, co jest marnotrawstwem. Najwyraźniej clear() i flush() nie rób tego, czego potrzebuję, więc czy istnieje sposób, aby to zrobić? Sprawdziłem dokumentację pod numerem http://www.cplusplus.com/reference/iostream/ostringstream/, ale nie ma tam niczego, co wydaje się robić to, czego potrzebuję. Czy istnieje sposób na zresetowanie lub wyczyszczenie strumienia?

Odpowiedz

18

Użyj stream.str("");, aby ciąg podstawowy był pusty. Co więcej, nie używaj ponownie obiektów. W C++ filozofia jest, aby obiekt, gdy jest to potrzebne i rozporządzania nim, kiedy skończysz:

{ 
    std::ostringstream oss; 
    oss << 10; 
    std::cout << oss.str(); 
} 

{ 
    std::ostringstream oss; 
    oss << 20.5; 
    std::cout << oss.str(); 
} 

Albo jeszcze lepiej:

std::cout << static_cast<std::ostringstream&>(std::ostringstream() << 10).str(); 
+0

+1: miał powiedzieć dokładnie to samo rzecz. Chociaż robienie 'stream.str (" ");' zawsze było dla mnie hackem. –

+2

Ogólnie zgadzam się z twoim wpisem, z wyjątkiem części, która zaczyna się od * Lub jeszcze lepiej: * i reszty, która następuje. Nie mógłbyś chyba myśleć, że to jest ** lepsze **, prawda ?! –

+0

@HappyGreenKidNaps: To tylko przykład. Oczywiście możesz napisać 'std :: cout << 10' i skończyć z tym. Gdybym potrzebował napisu, powiedziałbym, że 'std :: to_string (10)', przypuszczam. –

10

clear() tylko kasuje flagi błędów. To powszechny błąd. Chcesz zadzwonić str() i przekazać go ciąg pusty, aby wyczyścić bufor:

stream.str(""); 

zrobi to, co chcesz.