2012-07-12 31 views
5

thể trùng lặp:
How to reuse an ostringstream?Làm thế nào để bạn xóa một std :: ostringstream dụ để nó có thể được tái sử dụng?

tôi đã được sử dụng để chuyển đổi std::ostringstreamfloatint giá trị cho chuỗi nhưng tôi không thể tìm thấy anyway để tái sử dụng một ví dụ. Để minh họa cho những gì tôi muốn nói ở đây là sau cùng với những phương pháp mà tôi đã cố gắng sử dụng để xóa các dòng

#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; 
} 

tạo ra

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

này đem lại cho tôi một vấn đề như tôi phải tạo ra nhiều trường hợp của ostringstream là lãng phí. Rõ ràng clear()flush() không làm những gì tôi cần như vậy là có một cách để làm điều này? Tôi đã kiểm tra tài liệu tại http://www.cplusplus.com/reference/iostream/ostringstream/ nhưng không có gì ở đó dường như làm những gì tôi cần. Có cách nào để đặt lại hoặc xóa luồng không ??

Trả lời

18

Sử dụng stream.str(""); để tạo chuỗi bên dưới thành chuỗi rỗng. Tốt hơn, không sử dụng lại các đối tượng. Trong C++ triết lý là để làm cho một đối tượng khi bạn cần đến nó và vứt bỏ nó khi bạn đã hoàn tất:

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

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

Hoặc tốt hơn:

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

+1: Đã được về để nói chính xác cùng Điều. Mặc dù làm 'stream.str (" ");' luôn luôn cảm thấy như một hack với tôi. –

+2

Thường đồng ý với bài đăng của bạn ngoại trừ phần bắt đầu bằng * Hoặc tốt hơn: * và phần còn lại sau. Bạn không thể nghĩ rằng đó là ** tốt hơn **, phải không ?! –

+0

@HappyGreenKidNaps: Đây chỉ là một ví dụ. Tất nhiên bạn có thể viết 'std :: cout << 10' và được thực hiện với nó. Nếu tôi cần một chuỗi, tôi muốn nói 'std :: to_string (10)', tôi giả sử. –

10

clear() chỉ xóa các cờ lỗi. Đây là một sai lầm phổ biến. Bạn muốn gọi str() và chuyển một chuỗi trống để xóa bộ đệm:

stream.str(""); 

sẽ làm những gì bạn muốn.