2012-09-18 25 views
8

Próbuję zmodyfikować bufor string obiektu stringstream bez konieczności kopiowania ciąg, używając metody pubsetbuf, ale nie działa. Postępuję zgodnie z dokumentacją pod numerem http://www.cplusplus.com/reference/iostream/streambuf/pubsetbuf/. Oto mój przykładowy kod:stringstream-> rdbuf() -> pubsetbuf nie ustawia bufora

#include <iostream> 
#include <sstream> 

int main(int argc, char* argv[]) 
{ 
    std::stringstream stream("You say goodbye"); 
    char replace[] = {"And I say hello"}; 
    std::cout << stream.str() << std::endl; // Checking original contents 
    stream.rdbuf()->pubsetbuf(replace, 16); // Should set contents here 
    std::cout << stream.str() << std::endl; // But don't :(
    return 0; 
} 

a wyjście jest:

You say goodbye 
You say goodbye 

wiem, że mogę używać stream.str (wymienić), ale ta metoda kopiuje wartość „zastąpić”, a ja nie chcę robić kopii.

Czego mi brakuje?

Aktualizacja: używam VS2010

+1

prostu śmiesznie Szybkie wyszukiwanie SO - czy występuje ten problem? http://stackoverflow.com/questions/1494182/setting-the-internal-buffer-used-by-a-standard-stream-pubsetbuf –

+0

Jeśli używasz VS, spójrz na [to pytanie] (http: // /stackoverflow.com/q/10054396/416627) (i odpowiedz). To nie działa tak, jak myślisz, że tak. Jego implementacja jest zdefiniowana i wdrażana tylko tam, gdzie ma to sens. –

+0

Możliwy duplikat [Ustawianie wewnętrznego bufora używanego przez standardowy strumień (pubsetbuf)] (http://stackoverflow.com/questions/1494182/setting-the-internal-buffer-used-by-a-standard-stream-pubsetbuf) –

Odpowiedz

10

Nie należy ustawiać zawartości. pubsetbuf rozmowy virtual setbuf

basic_streambuf<charT,traits>* setbuf(charT* s, streamsize n); 

15 Efekty: wdrożenie zdefiniowane, z wyjątkiem tego setbuf (0,0) nie ma żadnego wpływu.

16 Zwroty: to.

VS 2010. Nie ma przeciążenie metody wirtualnej setbuf w basic_stringbuf, używa domyślnego z basic_streambuf

virtual _Myt *__CLR_OR_THIS_CALL setbuf(_Elem *, streamsize) 
    { // offer buffer to external agent (do nothing) 
    return (this); 
    } 
+0

Dzięki. Sądzę jednak, że "konkretne implementacje" w dokumentacji odnosiły się do konkretnych klas, a nie do konkretnej implementacji dostawcy. Przypuszczałem, że będzie dobrze działać w każdym kompilatorze C++. –