basic_istream::readsome

basic_istream::readsomeは、指定された文字数以下の文字列を入力ストリームから読み取る。

basic_istream::readsome - cpprefjp C++日本語リファレンス

readは文字数ちょうどなので、文字数に達しなかった場合、EOFやfailとなったが、こちらはそうならない。

まず、readのおさらい。

// ヘッダのインクルード
#include <iostream> // C++標準入出力
#include <sstream> // 新文字列ストリーム

// main関数
int main(){

  // 変数の初期化.
  std::istringstream iss("ABCDE"); // issを"ABCDE"で初期化.
  char str[] = "XXXXXXXXXX"; // strを"XXXXXXXXXX"で初期化.

  // readで読み込み.
  iss.read(str, 5); // strに5文字読み込み.
  std::cout << "str = " << str << std::endl; // strを出力.

  // issの状態
  if (iss.eof()){ // EOFのチェック.
    std::cout << "EOF" << std::endl; // "EOF"を出力.
  }
  if (iss.fail()){ // fail状態のチェック.
    std::cout << "fail" << std::endl; // "fail"を出力.
  }

  // プログラムの終了
  return 0; // 0を返して正常終了.

}

iss.readで"ABCDE"の5文字ぴったりを読み込む。

$ vi basic_istream.cpp
$ g++ basic_istream.cpp -o basic_istream
$ ./basic_istream
str = ABCDEXXXXX
$

成功。

// ヘッダのインクルード
#include <iostream> // C++標準入出力
#include <sstream> // 新文字列ストリーム

// main関数
int main(){

  // 変数の初期化.
  //std::istringstream iss("ABCDE"); // issを"ABCDE"で初期化.
  std::istringstream iss("ABC"); // issを"ABC"で初期化.
  char str[] = "XXXXXXXXXX"; // strを"XXXXXXXXXX"で初期化.

  // readで読み込み.
  iss.read(str, 5); // strに5文字読み込み.
  std::cout << "str = " << str << std::endl; // strを出力.

  // issの状態
  if (iss.eof()){ // EOFのチェック.
    std::cout << "EOF" << std::endl; // "EOF"を出力.
  }
  if (iss.fail()){ // fail状態のチェック.
    std::cout << "fail" << std::endl; // "fail"を出力.
  }

  // プログラムの終了
  return 0; // 0を返して正常終了.

}

issのコンストラクタに指定する文字列を"ABC"に変える。
文字数が足りないので、

$ vi basic_istream.cpp
$ g++ basic_istream.cpp -o basic_istream
$ ./basic_istream
str = ABCXXXXXXX
EOF
fail
$

EOFもfailも出る。

// ヘッダのインクルード
#include <iostream> // C++標準入出力
#include <sstream> // 新文字列ストリーム

// main関数
int main(){

  // 変数の初期化.
  std::istringstream iss("ABCDE"); // issを"ABCDE"で初期化.
  //std::istringstream iss("ABC"); // issを"ABC"で初期化.
  char str[] = "XXXXXXXXXX"; // strを"XXXXXXXXXX"で初期化.

  // readsomeで読み込み.
  //iss.read(str, 5); // strに5文字読み込み.
  iss.readsome(str, 5); // strに5文字読み込み.
  std::cout << "str = " << str << std::endl; // strを出力.

  // issの状態
  if (iss.eof()){ // EOFのチェック.
    std::cout << "EOF" << std::endl; // "EOF"を出力.
  }
  if (iss.fail()){ // fail状態のチェック.
    std::cout << "fail" << std::endl; // "fail"を出力.
  }

  // プログラムの終了
  return 0; // 0を返して正常終了.

}

文字列を"ABCDE"に戻して、今度はreadではなくreadsomeで読み込む。

$ vi basic_istream.cpp
$ g++ basic_istream.cpp -o basic_istream
 ./basic_istream
str = ABCDEXXXXX
$

文字数はぴったりなので、当然成功。
さて、問題はここから。

issのコンストラクタに再び"ABC"を指定。
文字数は足りないが、readsomeで読み込むと、

$ vi basic_istream.cpp
$ g++ basic_istream.cpp -o basic_istream
$ ./basic_istream
str = ABCXXXXXXX
$

ここではfailどころかEOFも出なかった。

Sample/cpp/basic_istream/readsome/src/basic_istream at master · bg1bgst333/Sample · GitHub