- istream[meta header]
- std[meta namespace]
- basic_istream[meta class]
- function[meta id-type]
basic_istream<CharT, Traits>& getline(char_type* s, streamsize n);
basic_istream<CharT, Traits>& getline(char_type* s, streamsize n, char_type delim);(非書式化入力関数)ストリームから改行文字が現れるまで(1行すべて)あるいは仮引数delimで指定された文字までの文字列を入力する。
仮引数delimがないオーバーロードでは、getline(s, n, widen('\n'))を呼び出す。
仮引数delimを持つものは以下の通り。
basic_istream<>::sentryオブジェクトを構築する。sentryオブジェクトが失敗を示した場合、何もしない。- 以下のいずれかを満たすまで、文字を入力して配列の要素へのポインタ
sに書き込んでゆく。以下の条件判断はこの順で行う。- EOFに達した。この場合、ローカルエラー状態に
eofbitを設定する。 Traits::eq(c, delim)が真となった。- 読み取った文字数が
n - 1になるまで書き込んだもしくはnが1未満であった。この場合、ローカルエラー状態にfailbitを設定する。
- EOFに達した。この場合、ローカルエラー状態に
- 1文字も入力がなされなかったら、ローカルエラー状態に
failbitを設定する。- 空行の場合はこれに該当しないことに注意。なぜなら、改行文字1文字を入力しているためである。
nが1以上の場合、必ずsの末尾にヌル文字を書き込む。
- 仮引数
is。
#include <iostream>
int main() {
const int buffer_size = 8;
char buffer[buffer_size];
// 1行入力するまで繰り返す。
for (;;) {
std::cin.getline(buffer, buffer_size);
if (std::cin.bad() || std::cin.eof()) {
break;
}
std::cout << buffer;
if (std::cin.fail()) {
// 1行の途中までしか入力できていない。
std::cin.clear(std::cin.rdstate() & ~std::ios_base::failbit);
} else {
// 行の終わりまで入力できたのでループを脱出する。
std::cout << std::endl;
break;
}
}
}- getline[color ff0000]
- std::cin[link /reference/iostream/cin.md]
- bad()[link /reference/ios/basic_ios/bad.md]
- eof()[link /reference/ios/basic_ios/eof.md]
- fail()[link /reference/ios/basic_ios/fail.md]
- clear[link /reference/ios/basic_ios/clear.md]
- rdstate()[link /reference/ios/basic_ios/rdstate.md]
- std::ios_base::failbit[link /reference/ios/ios_base/type-iostate.md]
1度で1行すべての入力が行えなかった場合の処理を追いかけやすくするため、この例はわざとbuffer_sizeを少なくしている。
Natsu wa yoru.
Natsu wa yoru.
TBD
- C++98
std::getline:std::basic_stringへ入力を行うもの。- P1264R2 Revising the wording of stream input operations
- C++23でローカルエラー状態の概念が導入され、入力関数のエラー処理セマンティクスが明確化された