2012-01-11 37 views
14

Khi tôi đặt thứ gì đó vào chuỗi, hãy nói một số thực, nếu sau đó tôi chèn đối tượng chuỗi đó vào cout ... tôi đang xem cái gì?cout << stringstream

Thông thường tôi nhận được một số số lạ. Đây có phải là vị trí bộ nhớ không? Chỉ tò mò thôi.

Dường như những nhận xét dưới đây nhấn nó nhưng đây là những gì tôi đang cố gắng để làm:

string stringIn; 
stringstream holdBuff; 
holdBuff << getline(cin, stringIn); 
cout << holdBuff; 

Về cơ bản tôi đã chỉ cố gắng để xem những gì holdBuff trông như thế nào khi tôi chèn stringIn. Tôi đang cố gắng để người dùng nhập một chuỗi và sau đó tôi muốn bước qua nó tìm kiếm nội dung của nó và possilbly chuyển đổi ...

Trả lời

19

Bạn nghĩ gì

holdBuff << getline(cin, stringIn); 

đang thực hiện. Kiểu trả về của getline là tham chiếu đến luồng đang được đọc (cin) trong trường hợp này. Kể từ khi không có << định nghĩa mà mất một std::istream như là đối số thứ hai, trình biên dịch cố gắng khác nhau chuyển đổi: trong C++ 11, std::istream có một chuyển đổi ngầm để bool, và trước đó C++, một chuyển đổi ngầm để std::ios*, hoặc một cái gì đó tương tự (nhưng việc sử dụng hợp lệ chỉ giá trị trả lại là chuyển đổi giá trị đó thành bool). Vì vậy, bạn hoặc là đầu ra 1 (C++ 11), hoặc một số địa chỉ ngẫu nhiên (trong thực tế, thường là địa chỉ của luồng, nhưng điều này không được đảm bảo).Nếu bạn muốn để có được các kết quả của một cuộc gọi đến getline thành một std::ostringstream, bạn cần hai hoạt động (với một tấm séc lỗi giữa chúng):

if (!getline(std::cin, stringIn)) 
    // Error handling here... 
holdBuff << stringIn; 

Tương tự như vậy, để viết nội dung của một std::ostringstream,

std::cout << holdBuf.str() ; 

là giải pháp đúng. Nếu bạn nhấn mạnh vào cách sử dụng một std::stringstream khi một std::ostringstream sẽ thích hợp hơn, bạn cũng có thể làm:

std::cout << holdBuf.rdbuf(); 

Các giải pháp đầu tiên là một lợi thế, tuy nhiên, vì nó là xa nhiều thành ngữ.

Trong mọi trường hợp, một lần nữa, không có << điều hành mà có bất kỳ iostream loại, do đó bạn kết thúc với kết quả của việc chuyển đổi ngầm để bool hoặc một con trỏ.

+0

Cảm ơn rất nhiều James. Thông tin tuyệt vời. Tôi sẽ phải tra cứu sự khác biệt giữa ostringstream và stringstream. Đó là cách tốt/nhập cảnh cấp độ để kéo trong một dòng có thể hỗn hợp các loại? Cảm ơn. – MCP

2
cout << s.rdbuf(); 

là những gì bạn muốn. Hoặc bạn có thể muốn

count << s.str(); 

có thể tốn kém hơn về tài nguyên.

13

Có, bạn có thể thấy địa chỉ của chuỗi.

Nếu bạn muốn hiển thị chuỗi nó chứa, hãy thử

cout << stream.str(); 
+0

điều này tạo bản sao của bộ đệm vì str() trả về theo giá trị. –

5

Có nó rất có thể là một vị trí bộ nhớ của một số hình thức hoặc khác. Nhiều khả năng nó là con trỏ tới chính đối tượng chuỗi.

Bạn có thể xác nhận điều này như sau:

std::stringstream ss; 
unsigned long long ll = (unsigned long long)&ss; 
cout << ll; 

Điều đó nói rằng khi bạn muốn cout một stringstream bạn nên sử dụng str() chức năng như sau:

cout << ss.str(); 
Các vấn đề liên quan