入力を読み取ろうとした後は、入力が成功したことを常に確認する必要があります。ストリームが読み取られる値の種類がわからない場合、最初にチェックしています。使用したい場合は、peek()
おそらくstd::char_traits<char>::eof()
最初にテストする必要があります。たとえば、次のようになります。
for (std::char_traits<char>::int_type c;
std::char_traits<char>::eof() != (c = in.peek())
&& !std::isdigit(static_cast<unsigned char>(c); ) {
...
}
あなたのセットアップstd::istreambuf_iterator<char>
では、実際にははるかに簡単なので、私は個人的に使用します:
for (std::istreambuf_iterator<char> it(in), end;
it != end && !std::isdigit(static_cast<unsigned char>(*it); ++it) {
word += *it;
}
char
符号なしの場合もありますが、正の値が必要std::isdigit()
です。通常、自分の 2 番目の名前を使用して署名するchar
と、未定義の動作が発生します。この問題を回避するには、char
パスを最初std::isdigit()
にキャストする必要があります。unsigned char