最終更新日時:
が更新

履歴 編集

function
<istream>

std::basic_istream::read

basic_istream<CharT, Traits>& read(char_type* s, streamsize n);

概要

(非書式化入力関数)ストリームから指定した数の文字を入力する。

実引数として配列要素へのポインタsとその要素数nを受け取る。 getメンバ関数などと異なり、sの末尾にヌル文字を書き込む処理がない。

また、n文字より少ない段階でEOFに達した場合を入力失敗として扱う(failbitを立てる)点も、他の多くのメンバ関数と異なる。

効果

  1. sentryオブジェクトを構築する。sentryオブジェクトが失敗を示した場合、何もしない。
  2. good()メンバ関数を呼び出してfalseであったら、setstate(failbit)を呼び出して終了する。
  3. 以下のいずれかを満たすまで、文字を入力して書き込む。
    • 実引数で指定されたn文字まで入力した。
    • EOFに達した。この場合、setstate(failbit | eofbit)を呼び出す。

戻り値

*this

#include <iostream>

int main() {
  char s[8];
  std::cin.read(s, sizeof s);
  auto size = std::cin.gcount();
  std::cout.write(s, size);
  std::cout << std::endl;
}

入力

ShinjukuNishiguchi

出力

Shinjuku

実装例

basic_istream<CharT, Traits>& read(char_type* s, streamsize n) {
  iostate state = goodbit;
  try {
    sentry s(*this, true);
    if (s) {
      if (good()) {
        for (streamsize i = 0; i < n; ++i) {
          auto c = rdbuf()->sbumpc();
          if (c == Traits::eof()) {
            state |= failbit | eofbit;
            break;
          }
          s[i] = Traits::to_char_type(c);
        }
      } else {
        state |= failbit;
      }
    }
  } catch (...) {
    例外を投げずにbadbitを設定する;
    if ((exceptions() & badbit) != 0) {
      throw;
    }
  }
  setstate(state);
  return *this;
}

バージョン

言語

  • C++98

参照