Difference between revisions of "cpp/string/basic string/getline"
(→Notes: Made the presentation a bit more friendly) |
m (langlinks, cosmetic) |
||
Line 30: | Line 30: | ||
@1@ Behaves as {{named req|UnformattedInputFunction}}, except that {{tt|input.gcount()}} is not affected. After constructing and checking the sentry object, performs the following: | @1@ Behaves as {{named req|UnformattedInputFunction}}, except that {{tt|input.gcount()}} is not affected. After constructing and checking the sentry object, performs the following: | ||
− | : | + | :* Calls {{c|str.erase()}} |
− | : | + | :* Extracts characters from {{tt|input}} and appends them to {{tt|str}} until one of the following occurs (checked in the order listed) |
::@a@ end-of-file condition on {{tt|input}}, in which case, {{tt|getline}} sets {{ltt|cpp/io/ios_base/iostate|eofbit}}. | ::@a@ end-of-file condition on {{tt|input}}, in which case, {{tt|getline}} sets {{ltt|cpp/io/ios_base/iostate|eofbit}}. | ||
::@b@ the next available input character is {{tt|delim}}, as tested by {{c|Traits::eq(c, delim)}}, in which case the delimiter character is extracted from {{tt|input}}, but is not appended to {{tt|str}}. | ::@b@ the next available input character is {{tt|delim}}, as tested by {{c|Traits::eq(c, delim)}}, in which case the delimiter character is extracted from {{tt|input}}, but is not appended to {{tt|str}}. | ||
::@c@ {{c|str.max_size()}} characters have been stored, in which case {{tt|getline}} sets {{ltt|cpp/io/ios_base/iostate|failbit}} and returns. | ::@c@ {{c|str.max_size()}} characters have been stored, in which case {{tt|getline}} sets {{ltt|cpp/io/ios_base/iostate|failbit}} and returns. | ||
− | : | + | :* If no characters were extracted for whatever reason (not even the discarded delimiter), {{tt|getline}} sets {{ltt|cpp/io/ios_base/iostate|failbit}} and returns. |
@2@ Same as {{c|getline(input, str, input.widen('\n'))}}, that is, the default delimiter is the endline character. | @2@ Same as {{c|getline(input, str, input.widen('\n'))}}, that is, the default delimiter is the endline character. | ||
Line 92: | Line 92: | ||
{{dsc end}} | {{dsc end}} | ||
− | + | {{langlinks|de|es|fr|it|ja|pt|ru|zh}} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
Revision as of 07:29, 7 August 2020
Defined in header <string>
|
||
template< class CharT, class Traits, class Allocator > std::basic_istream<CharT,Traits>& getline( std::basic_istream<CharT,Traits>& input, |
(1) | |
template< class CharT, class Traits, class Allocator > std::basic_istream<CharT,Traits>& getline( std::basic_istream<CharT,Traits>&& input, |
(1) | (since C++11) |
template< class CharT, class Traits, class Allocator > std::basic_istream<CharT,Traits>& getline( std::basic_istream<CharT,Traits>& input, |
(2) | |
template< class CharT, class Traits, class Allocator > std::basic_istream<CharT,Traits>& getline( std::basic_istream<CharT,Traits>&& input, |
(2) | (since C++11) |
getline
reads characters from an input stream and places them into a string:
input.gcount()
is not affected. After constructing and checking the sentry object, performs the following:
- Calls str.erase()
- Extracts characters from
input
and appends them tostr
until one of the following occurs (checked in the order listed)
delim
, as tested by Traits::eq(c, delim), in which case the delimiter character is extracted from input
, but is not appended to str
.getline
sets failbit and returns.
- If no characters were extracted for whatever reason (not even the discarded delimiter),
getline
sets failbit and returns.
- If no characters were extracted for whatever reason (not even the discarded delimiter),
Contents |
Parameters
input | - | the stream to get data from |
str | - | the string to put the data into |
delim | - | the delimiter character |
Return value
input
Notes
When consuming whitespace-delimited input (e.g. int n; std::cin >> n;) any whitespace that follows, including a newline character, will be left on the input stream. Then when switching to line-oriented input, the first line retrieved with getline
will be just that whitespace. In the likely case that this is unwanted behaviour, possible solutions include:
- An explicit extraneous initial call to
getline
- Removing consecutive whitespace with std::cin >> std::ws
- Ignoring all leftover characters on the line of input with cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Example
The following example demonstrates how to use getline
function to read user's input and how to process file line by line.
#include <string> #include <iostream> #include <sstream> int main() { // greet the user std::string name; std::cout << "What is your name? "; std::getline(std::cin, name); std::cout << "Hello " << name << ", nice to meet you.\n"; // read file line by line std::istringstream input; input.str("1\n2\n3\n4\n5\n6\n7\n"); int sum = 0; for (std::string line; std::getline(input, line); ) { sum += std::stoi(line); } std::cout << "\nThe sum is: " << sum << "\n"; }
Possible output:
What is your name? John Q. Public Hello John Q. Public, nice to meet you. The sum is 28
See also
extracts characters until the given character is found (public member function of std::basic_istream<CharT,Traits> )
|