[streambuf.virt.put]

# 31 Input/output library [[input.output]](./#input.output)

## 31.6 Stream buffers [[stream.buffers]](stream.buffers#streambuf.virt.put)

### 31.6.3 Class template basic_streambuf [[streambuf]](streambuf#virt.put)

#### 31.6.3.5 Virtual functions [[streambuf.virtuals]](streambuf.virtuals#streambuf.virt.put)

#### 31.6.3.5.5 Put area [streambuf.virt.put]

[ð](#lib:xsputn,basic_streambuf)

`streamsize xsputn(const char_type* s, streamsize n);
`

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L4003)

*Effects*: Writes up to n characters to the output sequence as if
by repeated calls tosputc(c)[.](#1.sentence-1)

The characters written are obtained from successive elements of
the array whose first element is designated by s[.](#1.sentence-2)

Writing stops when either n characters have been written or
a call tosputc(c) would returntraits​::​eof()[.](#1.sentence-3)

It is unspecified whether the function calls overflow() when pptr() == epptr() becomes true or whether it achieves the same effects by other means[.](#1.sentence-4)

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L4017)

*Returns*: The number of characters written[.](#2.sentence-1)

[ð](#lib:overflow,basic_streambuf)

`int_type overflow(int_type c = traits::eof());
`

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L4028)

*Effects*: Consumes some initial subsequence of the characters of the[*pending sequence*](#def:pending_sequence)[.](#3.sentence-1)

The pending sequence is defined as the concatenation of

- [(3.1)](#3.1)

the empty sequence if pbase() is null, otherwise thepptr() - pbase() characters beginning atpbase(), followed by

- [(3.2)](#3.2)

the empty sequence
iftraits​::​eq_int_type(c, traits​::​eof()) returnstrue, otherwise the sequence consisting of c[.](#3.sentence-2)

[4](#4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L4047)

*Preconditions*: Every overriding definition of this virtual function
obeys the following constraints:

- [(4.1)](#4.1)

  The effect of consuming a character on the associated output sequence is
specified[.](#4.1.sentence-1)[270](#footnote-270 "That is, for each class derived from a specialization of basic_­streambuf in this Clause ([stringbuf], [filebuf]), a specification of how consuming a character effects the associated output sequence is given. There is no requirement on a program-defined class.")

- [(4.2)](#4.2)

  Letr be the number of characters in the pending sequence not consumed[.](#4.2.sentence-1)
  Ifr is nonzero thenpbase() andpptr() are set so that:pptr() - pbase() == r and the r characters starting atpbase() are the associated output stream[.](#4.2.sentence-2)
  In case r is zero (all characters of the pending sequence have been consumed)
then eitherpbase() is set tonullptr,
orpbase() andpptr() are both set to the same non-null value[.](#4.2.sentence-3)

- [(4.3)](#4.3)

  The function may fail if either
appending some character to the associated output stream fails or
if it is unable to establishpbase() andpptr() according to the above rules[.](#4.3.sentence-1)

[5](#5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L4097)

*Returns*: traits​::​eof() or throws an exception
if the function fails[.](#5.sentence-1)

Otherwise,
returns some value other thantraits​::​eof() to indicate success[.](#5.sentence-2)[271](#footnote-271 "Typically, overflow returns c to indicate success, except when traits​::​eq_­int_­type(c, traits​::​eof()) returns true, in which case it returns traits​::​not_­eof(c).")

[6](#6)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L4118)

*Default behavior*: Returnstraits​::​eof()[.](#6.sentence-1)

[7](#7)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L4123)

*Remarks*: The member functionssputc() andsputn() call this function in case that
no room can be found in the put buffer enough to accommodate the
argument character sequence[.](#7.sentence-1)

[270)](#footnote-270)[270)](#footnoteref-270)

That is, for each class derived from a specialization ofbasic_streambuf in this Clause ([[stringbuf]](stringbuf "31.8.2 Class template basic_­stringbuf"), [[filebuf]](filebuf "31.10.3 Class template basic_­filebuf")),
a specification of how consuming a character effects the associated output sequence is given[.](#footnote-270.sentence-1)

There is no requirement on a program-defined class[.](#footnote-270.sentence-2)

[271)](#footnote-271)[271)](#footnoteref-271)

Typically,overflow returns c to indicate success, except whentraits​::​eq_int_type(c, traits​::​eof()) returnstrue,
in which case it returnstraits​::​not_eof(c)[.](#footnote-271.sentence-1)
