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 setg( char_type* gbeg, char_type* gcurr, char_type* gend); | ||
Sets the values of the pointers defining the get area.
After the call,eback()== gbeg,gptr()== gcurr andegptr()== gend are alltrue.
If any of[
gbeg,
gend)
,[
gbeg,
gcurr)
and[
gcurr,
gend)
is not avalid range, the behavior is undefined.
Contents |
gbeg | - | pointer to the new beginning of the get area |
gcurr | - | pointer to the new current character (get pointer) in the get area |
gend | - | pointer to the new end of the get area |
#include <iostream>#include <sstream> class null_filter_buf:publicstd::streambuf{std::streambuf* src;char ch;// single-byte bufferprotected:int underflow(){ traits_type::int_type i;while((i= src->sbumpc())=='\0');// skip zeroesif(!traits_type::eq_int_type(i, traits_type::eof())){ ch= traits_type::to_char_type(i); setg(&ch,&ch,&ch+1);// make one read position available}return i;}public: null_filter_buf(std::streambuf* buf): src(buf){ setg(&ch,&ch+1,&ch+1);// buffer is initially full}}; void filtered_read(std::istream& in){std::streambuf* orig= in.rdbuf(); null_filter_buf buf(orig); in.rdbuf(&buf);for(char c; in.get(c);)std::cout<< c; in.rdbuf(orig);} int main(){char a[]="This i\0s\0an e\0\0\0xample";std::istringstream in(std::string(std::begin(a),std::end(a))); filtered_read(in);}
Output:
This is an example
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 | setg did not require the input sequence to be a valid range | requires |
repositions the beginning, next, and end pointers of the output sequence (protected member function)[edit] |