std::getline(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

✨ NAME ✨

std::getline β€” std::getline (yes bestie, the name is literally the name, iconic πŸ’…)

okay so welcome to the manual page for std::getline(3), straight outta the C++ Standard Library, and it’s giving β€œread a whole line without losing your mind” energy πŸ¦‹


🌸 SYNOPSIS 🌸

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

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

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

          std::basic_istream<CharT, Traits>&
              getline( std::basic_istream<CharT, Traits>&& input,
       (2) (since C++11)

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

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

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

          std::basic_istream<CharT, Traits>&
       (4) (since C++11)
              getline( std::basic_istream<CharT, Traits>&& input,

                       std::basic_string<CharT, Traits, Allocator>& str );

🫢 the actual behavior, bestie 🫢

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

  1. For 1,2): behaves as UnformattedInputFunction, except that input.gcount() is not affected. After constructing and checking the sentry object, it 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.
  2. For 3,4): same as getline(input, str, input.widen('\n')), that is, the default delimiter is the endline character.

πŸŽ€ PARAMETERS πŸŽ€

  • input β€” the stream to get data from
  • str β€” the string to put the data into
  • delim β€” the delimiter character

πŸ’– RETURN VALUE πŸ’–

It returns input. That’s it. That’s the return value. slay ✨


πŸ¦‹ NOTES πŸ¦‹

okay so here’s the little gotcha, bestie 😭 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 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.

// Run this code

        #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

πŸ’€ DEFECT REPORTS πŸ’€

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

  • DR LWG 91, applied to C++98 β€” behavior as published: getline did not behave as an unformatted input function. Correct behavior: behaves as an unformatted input function.

πŸ‘‘ SEE ALSO πŸ‘‘

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

source/version/date, bestie: http://cppreference.com, 2024.06.10, page std::getline(3). that’s the whole manual, mwah πŸ«ΆπŸ’–βœ¨

πŸ“¦ where this page comes from