[string.io]

# 27 Strings library [[strings]](./#strings)

## 27.4 String classes [[string.classes]](string.classes#string.io)

### 27.4.4 Non-member functions [[string.nonmembers]](string.nonmembers#string.io)

#### 27.4.4.4 Inserters and extractors [string.io]

[ð](#lib:operator%3e%3e,basic_string)

`template<class charT, class traits, class Allocator>
  basic_istream<charT, traits>&
    operator>>(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
`

[1](#1)

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

*Effects*: Behaves as a formatted input function ([[istream.formatted.reqmts]](istream.formatted.reqmts "31.7.5.3.1 Common requirements"))[.](#1.sentence-1)

After constructing a sentry object,
if the sentry object returns true when converted to a value of type bool,
calls str.erase() and then extracts characters from is and appends them
to str as if by callingstr.append(1, c)[.](#1.sentence-2)

Ifis.width() is greater than zero, the maximum
number n of characters appended isis.width();
otherwise n isstr.max_size()[.](#1.sentence-3)

Characters are extracted and appended until any of the following
occurs:

- [(1.1)](#1.1)

*n* characters are stored;

- [(1.2)](#1.2)

end-of-file occurs on the input sequence;

- [(1.3)](#1.3)

isspace(c, is.getloc()) is true for the next available input character*c*[.](#1.sentence-4)

[2](#2)

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

After the last character (if any) is extracted,is.width(0) is called and thesentry object is destroyed[.](#2.sentence-1)

[3](#3)

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

If the function extracts no characters,ios_base​::​failbit is set in the input function's local error state
before setstate is called[.](#3.sentence-1)

[4](#4)

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

*Returns*: is[.](#4.sentence-1)

[ð](#lib:operator%3c%3c,basic_string)

`template<class charT, class traits, class Allocator>
  basic_ostream<charT, traits>&
    operator<<(basic_ostream<charT, traits>& os,
               const basic_string<charT, traits, Allocator>& str);
`

[5](#5)

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

*Effects*: Equivalent to: return os << basic_string_view<charT, traits>(str);

[ð](#lib:getline,basic_string)

`template<class charT, class traits, class Allocator>
  basic_istream<charT, traits>&
    getline(basic_istream<charT, traits>& is,
            basic_string<charT, traits, Allocator>& str,
            charT delim);
template<class charT, class traits, class Allocator>
  basic_istream<charT, traits>&
    getline(basic_istream<charT, traits>&& is,
            basic_string<charT, traits, Allocator>& str,
            charT delim);
`

[6](#6)

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

*Effects*: Behaves as an unformatted input function ([[istream.unformatted]](istream.unformatted "31.7.5.4 Unformatted input functions")),
except that it does not affect the value returned by subsequent calls tobasic_istream<>​::​gcount()[.](#6.sentence-1)

After constructing a sentry object,
if the sentry object returns true when converted to a value of type bool,
calls str.erase() and then extracts characters from is and appends them
to str as if by callingstr.append(1, c) until any of the following occurs:

- [(6.1)](#6.1)

end-of-file occurs on the input sequence;

- [(6.2)](#6.2)

traits​::​eq(c, delim) for the next available input character*c* (in which case,*c* is extracted but not appended);

- [(6.3)](#6.3)

str.max_size() characters are stored
(in which case,ios_base​::​failbit is set in the input function's local error state)[.](#6.sentence-2)

[7](#7)

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

The conditions are tested in the order shown[.](#7.sentence-1)

In any case,
after the last character is extracted, thesentry object is destroyed[.](#7.sentence-2)

[8](#8)

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

If the function extracts no characters,ios_base​::​failbit is set in the input function's local error state
before setstate is called[.](#8.sentence-1)

[9](#9)

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

*Returns*: is[.](#9.sentence-1)

[ð](#lib:getline,basic_string_)

`template<class charT, class traits, class Allocator>
  basic_istream<charT, traits>&
    getline(basic_istream<charT, traits>& is,
            basic_string<charT, traits, Allocator>& str);
template<class charT, class traits, class Allocator>
  basic_istream<charT, traits>&
    getline(basic_istream<charT, traits>&& is,
            basic_string<charT, traits, Allocator>& str);
`

[10](#10)

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

*Returns*: getline(is, str, is.widen('\n'))[.](#10.sentence-1)
