gpt4 book ai didi

c++ - 为序列号写入流 `operator>>`?

转载 作者:搜寻专家 更新时间:2023-10-31 01:12:08 28 4
gpt4 key购买 nike

我有一个如下形式的序列号类:

class SerialNumber { ... }

我想为它编写operator>>:

istream& operator>>(istream& i, SerialNumber& s)
{
???

return i;
}

序列号的长度始终为 19 个字符,并以十六进制数字开头。

如果我应该 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;
}

Dietmar Kü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;
}

最佳答案

标准格式化输入函数总是遵循相同的模式:

  1. 他们从构造一个 std::sentry 对象开始,该对象根据 std::ios_base::skipws 格式化标志的设置处理任何前导空格的跳过.
  2. 如果读取值以任何方式失败并且 std::ios_base::failbit 被设置,则读取值不变。
  3. 字符被消耗到第一个不匹配格式的字符。

也就是说,输入函数看起来像这样:

std::istream& operator>> (std::istream& in, SerialNumber& s) {
std::istream::sentry kerberos(in);
if (kerberos) {
std::istreambuf_iterator<char> it(in.rdbuf()), end;
char buffer[20] = {};
int i(0);
if (it != end && std::isxdigit(static_cast<unsigned char>(*it))) {
for (; it != end && i != 19
&& !std::isspace(static_cast<unsigned char>(*it)); ++i) {
buffer[i] = *it++;
}
}
if (i == 19) {
SerialNumber(buffer).swap(s);
}
else {
in.setstate(std::ios_base::failbit);
}
}
return in;
}

关于c++ - 为序列号写入流 `operator>>`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14050029/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com