我正在尝试从文件(或任何std :: istream)中读取尽可能多的std :: complex 。如果操作失败,我会检查ios :: eof()。如果它没有被设置,我会假设在解析数据时出现了错误,并且可以向用户报告输入文件存在错误。这个方案适用于double,但是在复数上却失败了。为什么?
以下是一些用于重现问题的代码:
输出为:
如果我将
这个问题出现在libstdc++中,但似乎在libc++中可以运行: 使用g++在coliru上运行 使用clang++和libc++在coliru上运行 编辑 我发现了一个2013年的错误报告,但问题似乎仍然存在,而该库非常常见。有没有办法让它对任何人都有效,而不必编写自己的解析器?
以下是一些用于重现问题的代码:
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
如果我将
std :: complex<double>
替换为double
,它会按预期工作,产生 val = 4
val = 1.2
flags: eof=1 fail=1 bad=0
这个问题出现在libstdc++中,但似乎在libc++中可以运行: 使用g++在coliru上运行 使用clang++和libc++在coliru上运行 编辑 我发现了一个2013年的错误报告,但问题似乎仍然存在,而该库非常常见。有没有办法让它对任何人都有效,而不必编写自己的解析器?
double
、(double)
和(double,double)
。 - dennis