名前空間
変種
操作

std::getline

From cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
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) input.gcount() が影響を受けないことを除いて、UnformattedInputFunction と同様に動作します。センティネルオブジェクトを構築しチェックした後、以下を実行します。
1) str.erase() を呼び出します。
2) input から文字を抽出し、以下のいずれかが発生するまで (記載順にチェックされます)、それらを str に追加します。
a) input 上のファイル終端条件。この場合、getlineeofbit を設定します。
b) 次に利用可能な入力文字が delim である場合。Traits::eq(c, delim) によってテストされ、この場合、区切り文字は input から抽出されますが、str には追加されません。
c) str.max_size() 文字が格納された場合。この場合、getlinefailbit を設定して戻ります。
3) 何らかの理由で文字が抽出されなかった場合 (破棄された区切り文字でさえも)、getlinefailbit を設定して戻ります。
3,4) getline(input, str, input.widen('\n')) と同じです。つまり、デフォルトの区切り文字は改行文字です。

目次

[編集] パラメータ

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

[編集] 戻り値

input

[編集] 注記

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

[編集]

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

#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';
}

実行結果の例

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> の public メンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)