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に達した。この場合、
is.setstate(ios_base::eofbit)
を呼び出す。 Traits::eq(c, delim)
が真となった。- 読み取った文字数が
n - 1
になるまで書き込んだもしくはn
が1未満であった。この場合、is.setstate(ios_base::failbit)
を呼び出す。
- EOFに達した。この場合、
- (
sentry
オブジェクトを破棄したのち)1文字も入力がなされなかったら、is.setstate(ios_base::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;
}
}
}
23
#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;
1度で1行すべての入力が行えなかった場合の処理を追いかけやすくするため、この例はわざとbuffer_size
を少なくしている。
入力
Natsu wa yoru.
出力
Natsu wa yoru.
実装例
TBD
バージョン
言語
- C++98
参照
std::getline
:std::basic_string
へ入力を行うもの。