2016-02-08 16 views
5

Tôi đã ngạc nhiên khi thấy chương trình của tôi đột nhiên đi yên tĩnh khi tôi thêm một cout tại một số điểm, vì vậy tôi bị cô lập mã có trách nhiệm:stringstream.rdbuf gây cout thất bại

std::stringstream data; 
data<<"Hello World\n"; 
std:std::fstream file{"hello.txt", std::fstream::out}; 
file<<data.rdbuf(); 
std::cout<<"now rdbuf..."<<std::endl; 
std::cout<<data.rdbuf()<<std::endl; 
std::cout<<"rdbuf done."<< std::endl; 

Chương trình lặng lẽ thoát ra mà không trận chung kết cout. Chuyện gì vậy? Nếu tôi thay đổi lần cuối .rdbuf() thành .str() thay thế thì nó sẽ hoàn thành.

Trả lời

6

Trong khi gọi đến std::cout<<data.rdbuf(), std::cout là không thể đọc được bất kỳ ký tự từ data 's filebuf vì vị trí đọc đã vào cuối của tập tin sau khi đầu ra trước; accordingly, điều này đặt failbit trên std::cout và cho đến khi trạng thái này bị xóa thì mọi đầu ra tiếp theo cũng sẽ không thành công (tức là dòng cuối cùng của bạn về cơ bản bị bỏ qua).

std::cout<<data.str()<<std::endl; sẽ không gây ra cout để đi vào trạng thái thất bại vì data.str() trả về một bản sao của chuỗi cơ bản không phân biệt nơi vị trí đọc là (cho stringstreams chế độ hỗn hợp anyway).

+0

Ok vì vậy nó không thực sự hủy bỏ sau đó, tôi đã cập nhật câu hỏi của mình trở nên thông minh hơn. –

+0

Hoặc, bạn có thể 'if (data.rdbuf() -> in_avail()) std :: cout << data.rdbuf();', do đó bạn lưu một chuỗi std tạm thời ::. Không chắc ai cũng nên quan tâm đến điều đó. Và cảm ơn cho cả câu hỏi và câu trả lời! Đã lưu ngày của tôi. – wessel