使用g++
编译器,下面的代码会在Macbook pro上抛出Illegal floating-point format
错误,但在使用g++
和clang++
编译的Fedora上运行时没有错误。
问题:为什么它不适用于Mac,有没有办法让它在Mac上运行
#include <iostream>
#include <sstream>
double stringToReal(std::string str) {
std::istringstream stream(str);
double value;
stream >> value >> std::ws;
if (stream.fail() || !stream.eof()) {
std::cerr << "stringToReal: Illegal floating-point format (" << str << ")";
}
return value;
}
int main() {
std::cout << stringToReal("1.457460091727E12");
return 0;
}
答案 0 :(得分:2)
这对我来说就像是一个OS X漏洞。尝试在EOF上读取std::ws
是在流上设置失败位,但它不应该。如果在字符串中附加任何空格,则错误就会消失。
实际上,它可能是Fedora的错误。根据{{3}},std::ws
“表现为UnformattedInputFunction
”,并说明UnformattedInputFunction
:
如果在输入流上设置了
eofbit
或badbit
,那么也设置failbit
,如果在此输入流的异常掩码中启用failbit
上的例外,抛出ios_base::failure
。
读入value
会设置eof位,因此读入std::ws
实际上应设置失败位。