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