Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/string/basic string/getline"

From cppreference.com
< cpp‎ | string‎ | basic string
m (Text replace - "{{concept" to "{{named req")
m (Synopsis: apply same indents as in e.g. erase()
 
(16 intermediate revisions by 10 users not shown)
Line 2: Line 2:
 
{{cpp/string/basic_string/navbar}}
 
{{cpp/string/basic_string/navbar}}
 
{{dcl begin}}
 
{{dcl begin}}
{{dcl header | string}}
+
{{dcl header|string}}
{{dcl | num=1 |
+
{{dcl|num=1|1=
 
template< class CharT, class Traits, class Allocator >
 
template< class CharT, class Traits, class Allocator >
std::basic_istream<CharT,Traits>& getline( std::basic_istream<CharT,Traits>& input,
+
std::basic_istream<CharT, Traits>&
                                          std::basic_string<CharT,Traits,Allocator>& str,
+
    getline( std::basic_istream<CharT, Traits>& input,
                                          CharT delim );
+
            std::basic_string<CharT, Traits, Allocator>& str, CharT delim );
 
}}
 
}}
{{dcl | num=1 | since=c++11 |
+
{{dcl|since=c++11|num=2|1=
 
template< class CharT, class Traits, class Allocator >
 
template< class CharT, class Traits, class Allocator >
std::basic_istream<CharT,Traits>& getline( std::basic_istream<CharT,Traits>&& input,
+
std::basic_istream<CharT, Traits>&
                                          std::basic_string<CharT,Traits,Allocator>& str,
+
    getline( std::basic_istream<CharT, Traits>&& input,
                                          CharT delim );
+
            std::basic_string<CharT, Traits, Allocator>& str, CharT delim );
 
}}
 
}}
{{dcl | num=2 |
+
{{dcl|num=3|1=
 
template< class CharT, class Traits, class Allocator >
 
template< class CharT, class Traits, class Allocator >
std::basic_istream<CharT,Traits>& getline( std::basic_istream<CharT,Traits>& input,
+
std::basic_istream<CharT, Traits>&
                                          std::basic_string<CharT,Traits,Allocator>& str );
+
    getline( std::basic_istream<CharT, Traits>& input,
 +
            std::basic_string<CharT, Traits, Allocator>& str );
 
}}
 
}}
{{dcl | num=2 | since=c++11 |
+
{{dcl|since=c++11|num=4|1=
 
template< class CharT, class Traits, class Allocator >
 
template< class CharT, class Traits, class Allocator >
std::basic_istream<CharT,Traits>& getline( std::basic_istream<CharT,Traits>&& input,
+
std::basic_istream<CharT, Traits>&
                                          std::basic_string<CharT,Traits,Allocator>& str );
+
    getline( std::basic_istream<CharT, Traits>&& input,
 +
            std::basic_string<CharT, Traits, Allocator>& str );
 
}}
 
}}
 
{{dcl end}}
 
{{dcl end}}
Line 29: Line 31:
 
{{tt|getline}} reads characters from an input stream and places them into a string:
 
{{tt|getline}} reads characters from an input stream and places them into a string:
  
@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,2@ Behaves as {{named req|UnformattedInputFunction}}, except that {{c|input.gcount()}} is not affected. After constructing and checking the sentry object, performs the following:
:@1@ Calls {{c|str.erase()}}
+
:@1@ Calls {{c|str.erase()}}.
:@2@ Extracts characters from {{tt|input}} and appends them to {{tt|str}} until one of the following occurs (checked in the order listed)
+
:@2@ Extracts characters from {{c|input}} and appends them to {{c|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 {{c|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 {{c|delim}}, as tested by {{c|Traits::eq(c, delim)}}, in which case the delimiter character is extracted from {{c|input}}, but is not appended to {{c|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.
 
:@3@ 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.
 
:@3@ 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.
+
@3,4@ Same as {{c|getline(input, str, input.widen('\n'))}}, that is, the default delimiter is the endline character.
  
 
===Parameters===
 
===Parameters===
 
{{par begin}}
 
{{par begin}}
{{par | input | the stream to get data from}}
+
{{par|input|the stream to get data from}}
{{par | str | the string to put the data into}}
+
{{par|str|the string to put the data into}}
{{par | delim | the delimiter character}}
+
{{par|delim|the delimiter character}}
 
{{par end}}
 
{{par end}}
  
 
===Return value===
 
===Return value===
{{tt|input}}
+
{{c|input}}
  
 
===Notes===
 
===Notes===
When used immediately after whitespace-delimited input, e.g. after {{c|int n; std::cin >> n;}}, {{tt|getline}} consumes the endline character left on the input stream by [[cpp/io/basic_istream/operator_gtgt|operator>>]], and returns immediately. A common solution is to ignore all leftover characters on the line of input with {{c|cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');}} before switching to line-oriented input.
+
When consuming whitespace-delimited input (e.g. {{c|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 {{tt|getline}} will be just that whitespace. In the likely case that this is unwanted behaviour, possible solutions include:
 +
* An explicit extraneous initial call to {{tt|getline}}.
 +
* Removing consecutive whitespace with {{c|std::cin >> std::ws}}.
 +
* Ignoring all leftover characters on the line of input with {{c|cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');}}.
  
 
===Example===
 
===Example===
 
{{example
 
{{example
| p=true
+
|p=true
| The following example demonstrates how to use {{tt|getline}} function to read user's input and how to process file line by line.
+
|The following example demonstrates how to use the {{tt|getline}} function to read user input, and to process a stream line by line, or by parts of a line using the {{c|delim}} parameter.
| code=#include <string>
+
|code=
 
#include <iostream>
 
#include <iostream>
 
#include <sstream>
 
#include <sstream>
+
#include <string>
 +
 
 
int main()
 
int main()
 
{
 
{
Line 67: Line 73:
 
     std::getline(std::cin, name);
 
     std::getline(std::cin, name);
 
     std::cout << "Hello " << name << ", nice to meet you.\n";
 
     std::cout << "Hello " << name << ", nice to meet you.\n";
+
 
 
     // read file line by line
 
     // read file line by line
 
     std::istringstream input;
 
     std::istringstream input;
 
     input.str("1\n2\n3\n4\n5\n6\n7\n");
 
     input.str("1\n2\n3\n4\n5\n6\n7\n");
 
     int sum = 0;
 
     int sum = 0;
     for (std::string line; std::getline(input, line); ) {
+
     for (std::string line; std::getline(input, line);)
 
         sum += std::stoi(line);
 
         sum += std::stoi(line);
    }
+
     std::cout << "\nThe sum is " << sum << ".\n\n";
     std::cout << "\nThe sum is: " << sum << "\n";
+
 
 +
    // use separator to read parts of the line
 +
    std::istringstream input2;
 +
    input2.str("a;b;c;d");
 +
    for (std::string line; std::getline(input2, line, ';');)
 +
        std::cout << line << '\n';
 
}
 
}
| p=true | output=
+
|p=true
 +
|output=
 
What is your name? John Q. Public
 
What is your name? John Q. Public
 
Hello John Q. Public, nice to meet you.
 
Hello John Q. Public, nice to meet you.
  
The sum is 28
+
The sum is 28.
 +
 
 +
a
 +
b
 +
c
 +
d
 
}}
 
}}
 +
 +
===Defect reports===
 +
{{dr list begin}}
 +
{{dr list item|wg=lwg|dr=91|std=C++98|before={{tt|getline}} did not behave as an unformatted input function|after=behaves as an unformatted input function}}
 +
{{dr list end}}
  
 
===See also===
 
===See also===
 
{{dsc begin}}
 
{{dsc begin}}
{{dsc inc | cpp/io/basic_istream/dsc getline}}
+
{{dsc inc|cpp/io/basic_istream/dsc getline}}
 
{{dsc end}}
 
{{dsc end}}
  
[[de:cpp/string/basic string/getline]]
+
{{langlinks|de|es|fr|it|ja|pt|ru|zh}}
[[es:cpp/string/basic string/getline]]
+
[[fr:cpp/string/basic string/getline]]
+
[[it:cpp/string/basic string/getline]]
+
[[ja:cpp/string/basic string/getline]]
+
[[pt:cpp/string/basic string/getline]]
+
[[ru:cpp/string/basic string/getline]]
+
[[zh:cpp/string/basic string/getline]]
+

Latest revision as of 16:35, 12 May 2024

 
 
 
std::basic_string
Member functions
Element access
Iterators
Capacity
Modifiers
Search
Operations
Constants
Non-member functions
I/O
getline
Comparison
(until C++20)(until C++20)(until C++20)(until C++20)(until C++20)(C++20)
Numeric conversions
(C++11)(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
Literals
Helper classes
Deduction guides (C++17)

 
Defined in header <string>
template< class CharT, class Traits, class Allocator >

std::basic_istream<CharT, Traits>&
    getline( std::basic_istream<CharT, Traits>& input,

             std::basic_string<CharT, Traits, Allocator>& str, CharT delim );
(1)
template< class CharT, class Traits, class Allocator >

std::basic_istream<CharT, Traits>&
    getline( std::basic_istream<CharT, Traits>&& input,

             std::basic_string<CharT, Traits, Allocator>& str, CharT delim );
(2) (since C++11)
template< class CharT, class Traits, class Allocator >

std::basic_istream<CharT, Traits>&
    getline( std::basic_istream<CharT, Traits>& input,

             std::basic_string<CharT, Traits, Allocator>& str );
(3)
template< class CharT, class Traits, class Allocator >

std::basic_istream<CharT, Traits>&
    getline( std::basic_istream<CharT, Traits>&& input,

             std::basic_string<CharT, Traits, Allocator>& str );
(4) (since C++11)

getline reads characters from an input stream and places them into a string:

1,2) Behaves as UnformattedInputFunction, except that input.gcount() is not affected. After constructing and checking the sentry object, performs the following:
1) Calls str.erase().
2) Extracts characters from input and appends them to str until one of the following occurs (checked in the order listed)
a) end-of-file condition on input, in which case, getline sets eofbit.
b) the next available input character is delim, as tested by Traits::eq(c, delim), in which case the delimiter character is extracted from input, but is not appended to str.
c) str.max_size() characters have been stored, in which case getline sets failbit and returns.
3) If no characters were extracted for whatever reason (not even the discarded delimiter), getline sets failbit and returns.
3,4) Same as getline(input, str, input.widen('\n')), that is, the default delimiter is the endline character.

Contents

[edit] Parameters

input - the stream to get data from
str - the string to put the data into
delim - the delimiter character

[edit] Return value

input

[edit] 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:

[edit] Example

The following example demonstrates how to use the getline function to read user input, and to process a stream line by line, or by parts of a line using the delim parameter.

#include <iostream>
#include <sstream>
#include <string>
 
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\n";
 
    // use separator to read parts of the line
    std::istringstream input2;
    input2.str("a;b;c;d");
    for (std::string line; std::getline(input2, line, ';');)
        std::cout << line << '\n';
}

Possible output:

What is your name? John Q. Public
Hello John Q. Public, nice to meet you.
 
The sum is 28.
 
a
b
c
d

[edit] Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior
LWG 91 C++98 getline did not behave as an unformatted input function behaves as an unformatted input function

[edit] See also

extracts characters until the given character is found
(public member function of std::basic_istream<CharT,Traits>) [edit]