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
adouble
上进行写入和读取时,以下程序显然显示出不一致
#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
- 在标准库中,是否有可能提取一个
,它也可以是无穷大的,而不必编写一个函数来提取单词并将其转换为doubledouble
根据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