为什么 operator>> on complex<double> 到达 EOF 时不设置 eofbit?
Why does operator>> on complex<double> not set eofbit if it reaches EOF?
我正在尝试从文件(或任何 std::istream
)中读取尽可能多的 std::complex<double>
。如果操作失败,我会检查 ios::eof()。如果没有设置,我就假设解析数据有错误,我可以向用户报告输入文件有错误。这个方案适用于双精度,但不知何故它在复数上失败了。为什么?
这里是重现问题的一些代码:
std::istringstream istr("4 1.2");
std::complex<double> val;
while( istr >> val )
std::cout << " val = " << val << std::endl;
std::cout << "flags: eof=" << istr.eof() << " fail=" << istr.fail() << " bad=" << istr.bad() << std::endl;
输出为
val = (4,0)
val = (1.2,0)
flags: eof=0 fail=1 bad=0
如果我用 double
替换 std::complex<double>
,它会按预期工作,产生
val = 4
val = 1.2
flags: eof=1 fail=1 bad=0
这个问题出现在 libstdc++ 上,但它似乎适用于 libc++:
run on coliru with clang++ and libc++
编辑 我从 2013 年找到了一个 bug report,但问题似乎仍然存在,而且图书馆很常见。有没有办法让我无需编写自己的解析器就可以让它为任何人工作?
它源于标准措辞:
[complex.ops]
12 Effects: Extracts a complex number x of the form: u,
(u), or (u,v), where u is the real part and v is the imaginary part (27.7.2.2).
13 Requires: The input values shall be convertible to T
. If bad input is encountered, calls is.setstate(ios_base::failbit)
(which may throw ios::failure
(27.5.5.4)).
14 Returns: is
.
15 Remarks: This extraction is performed as a series of simpler extractions. Therefore, the skipping of whitespace is specified to be the same for each of the simpler extractions.
特别是它没有指定在任何情况下都应设置 eofbit
。甚至评论也没有指定执行什么操作以及它们的语义是什么。有一个关于它的 Defect Report,它通过指定操作的语义来建议解决方案,如果我们幸运的话,它将进入 C++17。
我正在尝试从文件(或任何 std::istream
)中读取尽可能多的 std::complex<double>
。如果操作失败,我会检查 ios::eof()。如果没有设置,我就假设解析数据有错误,我可以向用户报告输入文件有错误。这个方案适用于双精度,但不知何故它在复数上失败了。为什么?
这里是重现问题的一些代码:
std::istringstream istr("4 1.2");
std::complex<double> val;
while( istr >> val )
std::cout << " val = " << val << std::endl;
std::cout << "flags: eof=" << istr.eof() << " fail=" << istr.fail() << " bad=" << istr.bad() << std::endl;
输出为
val = (4,0)
val = (1.2,0)
flags: eof=0 fail=1 bad=0
如果我用 double
替换 std::complex<double>
,它会按预期工作,产生
val = 4
val = 1.2
flags: eof=1 fail=1 bad=0
这个问题出现在 libstdc++ 上,但它似乎适用于 libc++:
run on coliru with clang++ and libc++
编辑 我从 2013 年找到了一个 bug report,但问题似乎仍然存在,而且图书馆很常见。有没有办法让我无需编写自己的解析器就可以让它为任何人工作?
它源于标准措辞:
[complex.ops]
12 Effects: Extracts a complex number x of the form: u, (u), or (u,v), where u is the real part and v is the imaginary part (27.7.2.2).
13 Requires: The input values shall be convertible toT
. If bad input is encountered, callsis.setstate(ios_base::failbit)
(which may throwios::failure
(27.5.5.4)).
14 Returns:is
.
15 Remarks: This extraction is performed as a series of simpler extractions. Therefore, the skipping of whitespace is specified to be the same for each of the simpler extractions.
特别是它没有指定在任何情况下都应设置 eofbit
。甚至评论也没有指定执行什么操作以及它们的语义是什么。有一个关于它的 Defect Report,它通过指定操作的语义来建议解决方案,如果我们幸运的话,它将进入 C++17。