如何从字符串流中提取双精度
How to extract double from a stringstream
在处理我的C++项目时,我在玩stringstream
对象时注意到一些奇怪的东西:我无法使用>>
从stringstream
中提取double
。
请考虑以下示例:
#include <string>
#include <sstream>
int main(int argc, const char * argv[]) {
std::string string("1000 ; 523277527397538 ; 0.183 ; 0.453 ; 0.5 ; 0.5 ; 0.033 ; 0 ; 0 ;");
std::stringstream stringstream(string);
int integer;
char character;
double doubleprec;
stringstream >> integer >> character;
stringstream >> integer >> character;
stringstream >> doubleprec >> character;
stringstream >> doubleprec >> character;
return 0;
}
使用我的调试器,我注意到变量integer
首先获取值1000
,然后获取值523277527397538
(如我预期的那样(,但doubleprec
始终获取值0
。
为什么?我是否错过了有关流如何工作的内容?
只有以下各项的第一个流输出语句:
stringstream >> integer >> character;
是成功的。其余三个不是因为你的 int 变量不能保存523277527397538
的值。将其更改为long long
:
long long integer;
当流提取无法将523277527397538
数字文本放入变量时,将设置字符串流的故障位,并且对字符串流提取的后续调用也会失败。一个好方法是在使用流 IO 时使用if
语句:
if (stringstream >> integer >> character){
// success
}
快速演示来强化罗恩的答案:(c++14(
#include <string>
#include <sstream>
#include <iostream>
int main(int argc, const char * argv[]) {
std::string string("1000 ; 523277527397538 ; 0.183 ; 0.453 ; 0.5 ; 0.5 ; 0.033 ; 0 ; 0 ;");
std::stringstream stringstream(string);
auto okfail = [](auto&& b) {
if (not b) return std::string("fail");
return std::string("ok");
};
auto read = [&](auto&& var, auto&& f) {
std::cout << "reading " << var << ". Stream is " << okfail(stringstream) << std::endl;
f();
std::cout << "read " << var << ". Stream is " << okfail(stringstream) << std::endl;
};
int integer1;
int integer2;
char character;
double doubleprec1, doubleprec2;
read("integer1", [&] { stringstream >> integer1 >> character; });
read("integer2", [&] { stringstream >> integer2 >> character; });
read("doubleprec1", [&] { stringstream >> doubleprec1 >> character; });
read("doubleprec2", [&] { stringstream >> doubleprec2 >> character; });
std::cout << integer1<< " " << integer2 << " " << doubleprec1 << " " << doubleprec2 << " " << std::endl;
return 0;
}
示例输出(iMac 64 位(:
reading integer1. Stream is ok
read integer1. Stream is ok
reading integer2. Stream is ok
read integer2. Stream is fail
reading doubleprec1. Stream is fail
read doubleprec1. Stream is fail
reading doubleprec2. Stream is fail
read doubleprec2. Stream is fail
1000 2147483647 0 0
现在将 integer2 更改为 long int:
reading integer1. Stream is ok
read integer1. Stream is ok
reading integer2. Stream is ok
read integer2. Stream is ok
reading doubleprec1. Stream is ok
read doubleprec1. Stream is ok
reading doubleprec2. Stream is ok
read doubleprec2. Stream is ok
1000 523277527397538 0.183 0.453
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 使用 Xcode 将双精度存储在数组C++中
- 使用从文件(stod、strtod、atof)中提取的数据C++从字符串转换为双精度.csv
- 将不同类型的模板参数包提取到双精度向量中会产生警告
- 如何从字符串流中提取双精度
- 从 CSV C++中提取双精度值时出现意外结果
- std::istream 提取运算符(双精度或浮点数)在 VS 2012 中非常慢
- 无法从不区分大小写的字符串中提取双精度类型
- 从带有文本的字符串中提取双精度类型
- 从字符串(如整型或双精度型)中提取数字