2010-10-01 31 views
13

Trên MSVC 2005, tôi có mã sau đây.Mục đích của hàm tạo chuỗi của ostringstream là gì?

std::ostringstream stream("initial string "); 
stream << 5; 
std::cout << stream.str(); 

Những gì tôi mong đợi là:

initial string 5 

Những gì tôi nhận được là:

5nitial string 

Khởi tạo dòng với một chuỗi, tôi mong chờ dòng để di chuyển vị trí của nó đến cùng của chuỗi ban đầu. Rõ ràng, STL không đồng ý với tôi (không phải lần đầu tiên).

Mục đích của hành vi đó là gì? Đây có phải là trường hợp sử dụng hữu ích cho bất cứ điều gì? Ngoài ra, có cách nào để nâng cao vị trí luồng vào cuối chuỗi ban đầu không?

Trả lời

18

Sử dụng một ostringstream và cung cấp một giá trị ban đầu cũng giống như mở một tập tin hiện tại cho văn bản. Bạn có một số dữ liệu ở đó và trừ khi bạn chỉ định khác, vị trí ban đầu của bạn sẽ ở đầu dữ liệu. Bạn có thể tìm kiếm dữ liệu, hoặc bạn chỉ định ios::ate để vị trí ban đầu con trỏ ghi vào cuối dữ liệu hiện có hoặc bạn có thể chỉ định ios::app để luôn đặt con trỏ ghi vào cuối dữ liệu hiện có.

+0

Điều này có ý nghĩa. 'ostringstream' phù hợp với các loại luồng khác và mặc định là bắt đầu cho đến khi được di chuyển một cách rõ ràng ở nơi khác. Cảm ơn. –

+2

Điều hiển nhiên là bạn giải thích nó liên quan đến các tập tin, nhưng trước khi tôi luôn mặc dù hành vi này rất kỳ quặc. Thực tế mới mẻ của tôi trong ngày. –

4

Để tìm kiếm đến cùng, làm như sau:

stream.seekp(0, ios_base::end); 

Là tại sao giá trị mặc định ghi vị trí để phía trước, tôi không biết.

14

Bạn có thể chỉ định (không bắt buộc) thứ hai tham số của các nhà xây dựng để thiết lập con trỏ dòng ở cuối:

std::ostringstream stream("initial string ", std::ios::ate); 
Các vấn đề liên quan