C++ 插入和提取数值_限制<;T>;::无限

C++ 插入和提取数值_限制<;T>;::无限,c++,stringstream,istringstream,numeric-limits,C++,Stringstream,Istringstream,Numeric Limits,使用std::numeric_limits::infinity在设置为“infinity”的std::stringstreamadouble上进行写入和读取时,以下程序显然显示出不一致 #include <string> #include <sstream> #include <iostream> #include <limits> #include <iterator> int main() { std::stringstr

使用
std::numeric_limits::infinity
在设置为“infinity”的
std::stringstream
a
double
上进行写入和读取时,以下程序显然显示出不一致

#include <string>
#include <sstream>
#include <iostream>
#include <limits>
#include <iterator>

int main() {
    std::stringstream stream;
    double d;

    // Part 1
    d=4;
    stream << d << " ";
    d=std::numeric_limits<double>::infinity();
    stream << d << " ";
    d=5;
    stream << d;
    stream.seekg(std::ios_base::beg);

    std::string s = stream.str();
    std::cout << "string : " << s << std::endl;

    // Part 2
    std::cout << "Extraction of data 1:" << std::endl;
    stream.seekp(std::ios_base::beg);
    stream >> d;
    std::cout << d << std::endl;
    stream >> d;
    std::cout << d << std::endl;
    stream >> d;
    std::cout << d << std::endl;

    // Part 3
    std::cout << "Extraction of data 2:" << std::endl;
    std::istringstream stream2(s);
    std::istream_iterator<double> iter(stream2);
    std::istream_iterator<double> eos;
    while (iter != eos)
    {
        std::cout << (*iter) << std::endl;
        iter++;
    }

    return 0;
}
在第1部分中,
double
“infinity”被写入
stringstream
,从中提取的
字符串
显示了对应于这样一个无限的“inf”

然而,在第2部分中,子字符串“inf”显然被提取为0。此外,流似乎处于不良状态,因为连续提取再次得到0

类似地,在第3部分中,使用
istream\u迭代器
从字符串中提取
double
s。迭代器在读取“inf”之前到达流的末尾

显然,我们可以通过提取单词而不是
double
,并在遇到“inf”时将每个单词转换为“正常”double,或转换为
std::numeric\u limits::infinity
,轻松解决问题。然而,考虑到标准库已经包含了大量从流中提取数据的代码,这似乎是在重新发明轮子

  • 插入和提取
    std::numeric_limits::infinity
    时为什么会有差异
  • 在标准库中,是否有可能提取一个
    double
    ,它也可以是无穷大的,而不必编写一个函数来提取单词并将其转换为double
附加说明

根据C++引用,类似函数已经将“INF”转换为无限表达式。因此,它看起来像是

std::stringstream::operator:因为阶段2过滤掉了诸如“p”、“N”或“i”之类的字符,所以十六进制浮点数,例如“0x1.23p-10”和字符串“NaN”或“inf”可能会被do_get(double)拒绝,即使它们是strod的有效输入:这是错误的
string : 4 inf 5
Extraction of data 1:
4
0
0
Extraction of data 2:
4