目次
はじめに
C++で cin >> my_string;
のように入力ストリーム演算子 >>
を使うと、スペースやタブ、改行までを一つの区切りとして、単語ごとにしか文字列を読み取れません。
「Hello World
」のように、スペースを含む一行全体を一つの文字列として読み取りたい場合には、<string>
ヘッダーで提供されている**std::getline()
**関数を使う必要があります。
この記事では、getline
の基本的な使い方と、ファイルや入力の終わりまで全ての行を読み込むための定石的なループの書き方を解説します。
一行ずつ読み込むサンプルコード
このコードは、標準入力 (cin
) から、入力の終わり(EOF)まで、一行ずつ文字列を読み取り、vector
に格納します。その後、vector
の内容を全て出力します。
完成コード
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
vector<string> lines;
string current_line;
cout << "複数行のテキストを入力してください (終了するにはEOFを入力):" << endl;
// 1. whileの条件式で、getlineを呼び出す
while (getline(cin, current_line)) {
// 2. 読み込みが成功したら、vectorに追加
lines.push_back(current_line);
}
// 3. 読み込んだ全行を出力
cout << "\n--- 入力された内容 ---" << endl;
for (const string& line : lines) {
cout << line << endl;
}
return 0;
}
EOFの入力方法: Windowsでは Ctrl+Z
→ Enter
、Linux/macOSでは Ctrl+D
。
コードの解説
while (getline(cin, current_line))
これが、入力の終わりまで一行ずつ読み込むための、C++における標準的なイディオム(定石)です。
getline(入力ストリーム, 文字列変数)
:- 第1引数:
cin
やifstream
オブジェクトなどの、入力ストリームを指定します。 - 第2引数: 読み取った一行を格納するための
std::string
変数を指定します。
- 第1引数:
- 動作:
getline
は、ストリームから改行文字\n
までを読み取り、それを第2引数の文字列変数に格納します(改行文字自体は文字列に含まれません)。 - 戻り値とループ:
getline
は、読み込みが成功すると、true
と評価されるストリームオブジェクトを返します。入力の終端(EOF)に達するなどして読み込みが失敗すると、false
と評価される状態になるため、while
ループが自動的に終了します。
まとめ
今回は、C++でスペースを含む一行の文字列を読み取るためのstd::getline
関数について解説しました。
getline(ストリーム, 文字列変数)
の形で使う。while (getline(...))
というイディオムで、入力の終わりまで全ての行を処理できる。- この方法は、
cin
(標準入力)だけでなく、ifstream
(ファイル入力)でも全く同じように機能する。
>>
演算子が単語単位の入力に適しているのに対し、getline
は行単位の入力を扱うための必須のツールです。