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ỏ.
Nguồn
2012-01-11 10:24:44
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