I/O manipulators | ||||
Print functions(C++23) | ||||
C-style I/O | ||||
Buffers | ||||
(C++23) | ||||
(C++98/26*) | ||||
(C++20) | ||||
Streams | ||||
Abstractions | ||||
File I/O | ||||
String I/O | ||||
Array I/O | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
(C++98/26*) | ||||
(C++98/26*) | ||||
(C++98/26*) | ||||
Synchronized Output | ||||
(C++20) | ||||
Types | ||||
Error category interface | ||||
(C++11) | ||||
(C++11) |
|
|
protected: void setp( char_type* pbeg, char_type* pend); | ||
Sets the values of the pointers defining the put area.
After the call,pbase()== pbeg,pptr()== pbeg andepptr()== pend are alltrue.
If any of[
pbeg,
pend)
is not avalid range, the behavior is undefined.
Contents |
pbeg | - | pointer to the new beginning of the put area |
pend | - | pointer to the new end of the put area |
#include <array>#include <cstddef>#include <iostream> // Buffer for std::ostream implemented by std::arraytemplate<std::size_t size,class CharT=char>struct ArrayedStreamBuffer:std::basic_streambuf<CharT>{using Base=std::basic_streambuf<CharT>;using char_type=typename Base::char_type; ArrayedStreamBuffer(){// put area pointers to work with “buffer” Base::setp(buffer.data(), buffer.data()+ size);} void print_buffer(){for(char_type i: buffer){if(i==0)std::cout<<"\\0";elsestd::cout<< i;std::cout<<' ';}std::cout<<'\n';} private:std::array<char_type, size> buffer{};// value-initialize “buffer”}; int main(){ ArrayedStreamBuffer<10> streambuf;std::ostream stream(&streambuf); stream<<"hello"; stream<<","; streambuf.print_buffer();}
Output:
h e l l o , \0 \0 \0 \0
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 4023 | C++98 | setp did not require the output sequence to be a valid range | requires |
repositions the beginning, next, and end pointers of the input sequence (protected member function)[edit] |