次の形式のシリアル番号クラスがあります。
class SerialNumber { ... }
そして私はそれのために書きたいですoperator>>
:
istream& operator>>(istream& i, SerialNumber& s)
{
???
return i;
}
シリアル番号は常に19文字の長さで、16進数で始まります。
私はistream.read
19文字である必要があるかどうか混乱しています。プレフィックスの空白が含まれる場合があります。?
または、を読んでi >> std::string
から、19文字の長さであることを確認する必要があるかどうか。あなたがそれを読むとき、std::string
それは空白をスキップします(それを実装する標準的な方法はありますか?)さらに私がそれを読むならば、std::string
それは有効な19文字のシリアル番号プレフィックスを持っているかもしれません、そして私は入力を「読み過ぎ」ているかもしれません。?
アップデート:
inline istream& operator>>(istream& is, SerialNumber& id)
{
ostringstream os;
is >> ws;
for (int i = 0; i < 19; i++)
{
char c;
is >> c;
os << c;
}
id = DecodeId(os.str());
return is;
}
DietmarKühlコードの部分的にサニタイズされたバージョン:
istream& operator>> (istream& in, SerialNumber& sn)
{
constexpr size_t n = 19;
istream::sentry se(in);
if (!se)
return in;
istreambuf_iterator<char> it(in.rdbuf()), end;
if (it == end || !isxdigit(*it))
{
in.setstate(ios_base::failbit);
return in;
}
string s(n,'?');
for (size_t i = 0; it != end && i < n && !isspace(char(*it)), ++i)
s[i] = *it++;
sn = DecodeId(s);
if (failed to decode)
in.setstate(ios_base::failbit);
return in;
}