2009-04-07 30 views
5

tôi có mã này,Tại sao stringstreams rdbuf() và str() cho tôi đầu ra khác nhau?

int main() 
{ 
    std::string st; 
    std::stringstream ss; 
    ss<<"hej hej med dig"<<std::endl; 

    std::getline(ss,st,' '); 
    std::cout <<"ss.rdbuf()->str() : " << ss.rdbuf()->str(); 
    std::cout <<"ss.rdbuf() : " << ss.rdbuf(); 
    return 0; 
} 

Cho tôi ra này

ss.rdbuf() -> str(): hej hej MED đào

ss.rdbuf(): hej med dig

Nhưng tại sao vậy? Có phải vì định nghĩa ostreams của nhà điều hành < str() cho tôi đầu ra khác nhau. Trong mắt tôi, đầu ra sẽ giống nhau ngay cả khi tôi đã sử dụng đường dây.

Trả lời

6
ss.rdbuf()->str(); 

Returns sao chép tất cả các nội dung đệm.

làm gì std::cout << ss.rdbuf();?

Xem mô tả cho

basic_ostream<charT,traits>& operator<<(basic_streambuf<charT,traits>* sb); 

Nó đọc từng ký tự từ bộ đệm và viết chúng vào ostream, cho đến khi eof/thất bại về kỹ năng viết/ngoại lệ xảy ra.

Bạn đã đọc một từ từ buff. Bây giờ nó đọc phần còn lại.

+0

Ồ. Thực tế là tôi đã không tìm thấy nó trong một trong những cuốn sách đắt tiền của tôi C++ là Im trên một kỳ nghỉ, vì vậy tôi chỉ có google và tôi couldnt tìm thấy một trang web giải thích hành vi << nhà điều hành theo một cách mà tôi hiểu. Tôi thực sự nghĩ rằng getline gỡ bỏ thẻ với delim từ dòng. – mslot

+1

Tôi không sử dụng một trong những cuốn sách C++ đắt tiền. Tôi chỉ thiếu rằng hành vi này không phải là rbuf() được chỉ định và bắt đầu tìm kiếm tiêu chuẩn cho toán tử quá tải này <<. – bayda

+1

http://ra.dkuug.dk/jtc1/sc22/open/n2356/ - bản thảo tiêu chuẩn C++ miễn phí – bayda

3

Để trích dẫn từ kinh thánh trên dòng C++ I/O, Langer and Kreft, gọi str() trên bộ đệm luồng (tức là thứ được trả về bởi rdbuf()) "hoạt động theo cách cực kỳ phản trực giác" (trang 72 trong ấn bản của tôi)). Đối với toàn bộ câu chuyện, bạn sẽ phải đọc cuốn sách.

Nếu bạn không nhận được một câu trả lời thỏa đáng ở đây, hãy thử các nhóm usenet:

http://groups.google.com/group/comp.lang.c++.moderated

+0

Ồ. Tôi chưa bao giờ đi về cuốn sách đó !! Âm thanh như một cuốn sách hay, bởi vì, tôi nghĩ rằng tôi giống như sự phức tạp xung quanh các luồng C++. – mslot

+0

Đó là cuốn sách hay - nếu bạn quan tâm đến luồng. Mà thẳng thắn, vài lập trình viên C++ (tôi bao gồm) là. –

+0

Nhưng trong ví dụ của tôi, không nên rdbuf() và rdbuf() -> str() trả về cùng một điều vì tham số đầu tiên của getline là một lời gọi tham chiếu? – mslot

Các vấn đề liên quan