std::getline
From cppreference.com
< cpp | string | basic string
| ヘッダ <string> で定義 |
||
| template< class CharT, class Traits, class Allocator > std::basic_istream<CharT, Traits>& |
(1) | |
| template< class CharT, class Traits, class Allocator > std::basic_istream<CharT, Traits>& |
(2) | (C++11以降) |
| template< class CharT, class Traits, class Allocator > std::basic_istream<CharT, Traits>& |
(3) | |
| template< class CharT, class Traits, class Allocator > std::basic_istream<CharT, Traits>& |
(4) | (C++11以降) |
getline は入力ストリームから文字を読み取り、それらを文字列に配置します。
1,2) input.gcount() が影響を受けないことを除いて、UnformattedInputFunction と同様に動作します。センティネルオブジェクトを構築しチェックした後、以下を実行します。
1) str.erase() を呼び出します。
2) input から文字を抽出し、以下のいずれかが発生するまで (記載順にチェックされます)、それらを str に追加します。
b) 次に利用可能な入力文字が delim である場合。Traits::eq(c, delim) によってテストされ、この場合、区切り文字は input から抽出されますが、str には追加されません。
3,4) getline(input, str, input.widen('\n')) と同じです。つまり、デフォルトの区切り文字は改行文字です。
目次 |
[編集] パラメータ
| input | - | データを取得するストリーム |
| str | - | データを格納する文字列 |
| delim | - | 区切り文字 |
[編集] 戻り値
input
[編集] 注記
空白で区切られた入力 (例: int n; std::cin >> n;) を消費する場合、改行文字を含むそれに続く空白は入力ストリームに残ります。その後、行指向入力に切り替えると、getline で取得される最初の行は単なるその空白になります。これが望ましくない動作である可能性が高い場合、考えられる解決策は以下の通りです。
getlineへの明示的な余分な最初の呼び出し。- std::cin >> std::ws で連続する空白を削除する。
- cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); で入力行の残りの文字をすべて無視する。
[編集] 例
次の例は、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 メンバ関数) |