最終更新日時:
が更新

履歴 編集

function
<istream>

std::basic_istream::getline

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, widen('\n'))を呼び出す。 仮引数delimを持つものは以下の通り。

  1. basic_istream<>::sentryオブジェクトを構築する。sentryオブジェクトが失敗を示した場合、何もしない。
  2. 以下のいずれかを満たすまで、文字を入力して配列の要素へのポインタsに書き込んでゆく。以下の条件判断はこの順で行う。
    1. EOFに達した。この場合、is.setstate(ios_base::eofbit)を呼び出す。
    2. Traits::eq(c, delim)が真となった。
    3. 読み取った文字数がn - 1になるまで書き込んだもしくはnが1未満であった。この場合、is.setstate(ios_base::failbit)を呼び出す。
  3. 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;
    }
  }
}

1度で1行すべての入力が行えなかった場合の処理を追いかけやすくするため、この例はわざとbuffer_sizeを少なくしている。

入力

Natsu wa yoru.

出力

Natsu wa yoru.

実装例

TBD

バージョン

言語

  • C++98

参照

  • std::getline: std::basic_stringへ入力を行うもの。