Namespaces
Variants

std::getline

From ja.cppreference.net
 
 
 
std::basic_string
 
ヘッダ <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) (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) (C++11以降)

getline 入力ストリームから文字を読み取り、文字列に格納します。

1,2) UnformattedInputFunctionとして動作しますが、input.gcount()は影響を受けません。セントリーオブジェクトを構築してチェックした後、以下を実行します。
1) str.erase().
を呼び出します。2)inputから文字を抽出し、strに追加します。以下のいずれかが発生するまで続けます(リストされた順序でチェックされます)。
a) inputのファイル終端状態に達した場合、getlineはeofbitを設定します。
b) 次に利用可能な入力文字がdelimである場合、Traits::eq(c, delim)でテストされ、その区切り文字はinputから抽出されますが、strには追加されません。
c) str.max_size() 文字が格納された場合、getlineはfailbitを設定して戻ります。
3) 何らかの理由で文字が抽出されなかった場合(破棄された区切り文字も含めて)、getlineはfailbitを設定して戻ります。
3,4) getline(input, str, input.widen('\n'))と同じです。つまり、デフォルトの区切り文字は改行文字です。

パラメータ

input - データを取得するストリーム
str - データを格納する文字列
delim - 区切り文字

戻り値

input

注記

空白文字で区切られた入力(例: int n ; std:: cin >> n ; )を読み込む場合、後続の空白文字(改行文字を含む)は入力ストリームに残されます。その後、行指向の入力に切り替えた場合、 getline で取得される最初の行はその空白文字だけになります。この動作が望ましくない場合、考えられる解決策には以下があります:

例

以下の例は、getline関数を使用してユーザー入力を読み取り、ストリームを行単位で処理する方法、またはdelimパラメータを使用して行の一部を処理する方法を示しています。

#include <iostream>
#include <sstream>
#include <string>
int main()
{
    // ユーザーへの挨拶
    std::string name;
    std::cout << "What is your name? ";
    std::getline(std::cin, name);
    std::cout << "Hello " << name << ", nice to meet you.\n";
    // ファイルを行単位で読み取り
    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";
    // セパレータを使用して行の一部を読み取り
    std::istringstream input2;
    input2.str("a;b;c;d");
    for (std::string line; std::getline(input2, line, ';');)
        std::cout << line << '\n';
}

出力例:

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

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 91 C++98 getline は非書式化入力関数として動作していなかった 非書式化入力関数として動作する

関連項目

指定された文字が見つかるまで文字を抽出する
( std::basic_istream<CharT,Traits> の公開メンバー関数)