basic_istream::readsomeは、指定された文字数以下の文字列を入力ストリームから読み取る。
basic_istream::readsome - cpprefjp C++日本語リファレンス
readは文字数ちょうどなので、文字数に達しなかった場合、EOFやfailとなったが、こちらはそうならない。
まず、readのおさらい。
#include <iostream>
#include <sstream>
int main(){
std::istringstream iss("ABCDE");
char str[] = "XXXXXXXXXX";
iss.read(str, 5);
std::cout << "str = " << str << std::endl;
if (iss.eof()){
std::cout << "EOF" << std::endl;
}
if (iss.fail()){
std::cout << "fail" << std::endl;
}
return 0;
}
iss.readで"ABCDE"の5文字ぴったりを読み込む。
$ vi basic_istream.cpp
$ g++ basic_istream.cpp -o basic_istream
$ ./basic_istream
str = ABCDEXXXXX
$
成功。
#include <iostream>
#include <sstream>
int main(){
std::istringstream iss("ABC");
char str[] = "XXXXXXXXXX";
iss.read(str, 5);
std::cout << "str = " << str << std::endl;
if (iss.eof()){
std::cout << "EOF" << std::endl;
}
if (iss.fail()){
std::cout << "fail" << std::endl;
}
return 0;
}
issのコンストラクタに指定する文字列を"ABC"に変える。
文字数が足りないので、
$ vi basic_istream.cpp
$ g++ basic_istream.cpp -o basic_istream
$ ./basic_istream
str = ABCXXXXXXX
EOF
fail
$
EOFもfailも出る。
#include <iostream>
#include <sstream>
int main(){
std::istringstream iss("ABCDE");
char str[] = "XXXXXXXXXX";
iss.readsome(str, 5);
std::cout << "str = " << str << std::endl;
if (iss.eof()){
std::cout << "EOF" << std::endl;
}
if (iss.fail()){
std::cout << "fail" << std::endl;
}
return 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