使用从 .csv 文件(stod、strtod、atof)中提取的数据在 C++ 中从字符串转换为双精度
Conversion from string to double in C++ with data extracted from .csv file (stod, strtod, atof)
当我尝试使用函数 stod、strtod 和 atof 将从 csv 文件中提取的字符串值转换为 double 时,我遇到了问题。我只得到值的整数部分。
我用catkin build编译,用于构建ROS中使用的包。
我要转换的值是此 csv 文件第二行中的 8 个值:
"1","2","3","4","0.0509105","-0.0101653","-0.105985","-0.0534463","Joint Positions"
csv file
我将它们提取到一个字符串向量中:
代码:
ifstream myfile;
myfile.open(path+robot_state_name+".csv");
string str_value;
getline(myfile, str_value); //The first line will be overwriten
vector<string> positions_str;
cout<<"Positions in string format from csv file : "<<endl;
for(int i = 0; i<=nb_of_variables-1; ++i){
getline(myfile, str_value,',');
positions_str.push_back(str_value);
cout<<i<<" : "<<positions_str[i]<<endl;
}
控制台输出:
Positions in string format from csv file :
0 : 1
1 : 2
2 : 3
3 : 4
4 : "0.0509105"
5 : "-0.0101653"
6 : "-0.105985"
7 : "-0.0534463"
然后我用std::stod()把数据转成double。它适用于前 4 个数字,但随后会引发错误。
并不是 stod() 承认的小数点分隔符是点,如 csv 文件中那样。
代码:
cout<<"Position in double format using stod() : "<<endl;
for(int i = 0; i<=nb_of_variables-1; ++i){
cout<<i<<" : "<<stod(positions_str[i])<<endl;
}
控制台输出:
Position in double format using stod() :
0 : 1
1 : 2
2 : 3
3 : 4
terminate called after throwing an instance of 'std::invalid_argument'
what(): stod
Abandon (core dumped)
stod() 似乎不能抓住要点...我也尝试了 strtod() 和 atof(),我最后 4 个值 return 0。
但是当我自己输入值时,它起作用了。
代码:
cout<<"Results of these 3 functions when I type the string values by hand : "<<endl;
positions_str = {"1", "2", "3", "4", "0.0509105", "-0.0101653", "-0.105985", "-0.0534463"};
cout<<"stod() : strtod() : atof() : "<<endl;
char* end_strtod;
for(int i = 0; i<=nb_of_variables-1; ++i){
cout<<stod(positions_str[i])<<" ; "<<strtod(positions_str[i].c_str(), &end)<<" ; "<<atof(positions_str[i].c_str())<<endl;
}
控制台输出:
Results of these 3 functions when I type the string values by hand :
stod() : strtod() : atof() :
1 ; 1 ; 1
2 ; 2 ; 2
3 ; 3 ; 3
4 ; 4 ; 4
0.0509105 ; 0.0509105 ; 0.0509105
-0.0101653 ; -0.0101653 ; -0.0101653
-0.105985 ; -0.105985 ; -0.105985
-0.0534463 ; -0.0534463 ; -0.0534463
我把我为 strtod 和 atof 编写的代码以及函数定义放在那里。
代码:
cout<<"Position in double format using strtod() : "<<endl;
char* end;
for(int i = 0; i<=nb_of_variables-1; ++i){
cout<<i<<" : "<<strtod(positions_str[i].c_str(), &end)<<endl;
}
cout<<"Position in double format using atof() : "<<endl;
for(int i = 0; i<=nb_of_variables-1; ++i){
cout<<i<<" : "<<atof(positions_str[i].c_str())<<endl;
}
控制台输出:
Position in double format using strtod() :
0 : 1
1 : 2
2 : 3
3 : 4
4 : 0
5 : 0
6 : 0
7 : 0
Position in double format using atof() :
0 : 1
1 : 2
2 : 3
3 : 4
4 : 0
5 : 0
6 : 0
7 : 0
非常感谢那些花时间回答的人。
在调用 std::stod.
之前,您需要从字符串的开头和结尾删除 "
将您的转换代码更改为:
for (auto &s : positions_str)
s.erase(remove(s.begin(), s.end(), '\"'), s.end()); // this will remove double quotes from the string if present
cout << "Position in double format using stod() : " << endl;
for(int i = 0; i < positions_str.size(); ++i)
cout << i << " : " << stod(positions_str[i]) << endl;
好吧,您应该在使用文本编辑器打开 csv
文件后发布了它的内容。
结构是这样的:
1,2,3,4,"0.0509105","-0.0101653","-0.105985","-0.0534463","Joint Positions"
前四列为数字类型等一般或字符串。
如果前四个带有 "
,那么您将不会获得索引 0 - 3
的结果。
当我尝试使用函数 stod、strtod 和 atof 将从 csv 文件中提取的字符串值转换为 double 时,我遇到了问题。我只得到值的整数部分。
我用catkin build编译,用于构建ROS中使用的包。 我要转换的值是此 csv 文件第二行中的 8 个值:
"1","2","3","4","0.0509105","-0.0101653","-0.105985","-0.0534463","Joint Positions"
csv file
我将它们提取到一个字符串向量中:
代码:
ifstream myfile;
myfile.open(path+robot_state_name+".csv");
string str_value;
getline(myfile, str_value); //The first line will be overwriten
vector<string> positions_str;
cout<<"Positions in string format from csv file : "<<endl;
for(int i = 0; i<=nb_of_variables-1; ++i){
getline(myfile, str_value,',');
positions_str.push_back(str_value);
cout<<i<<" : "<<positions_str[i]<<endl;
}
控制台输出:
Positions in string format from csv file :
0 : 1
1 : 2
2 : 3
3 : 4
4 : "0.0509105"
5 : "-0.0101653"
6 : "-0.105985"
7 : "-0.0534463"
然后我用std::stod()把数据转成double。它适用于前 4 个数字,但随后会引发错误。 并不是 stod() 承认的小数点分隔符是点,如 csv 文件中那样。
代码:
cout<<"Position in double format using stod() : "<<endl;
for(int i = 0; i<=nb_of_variables-1; ++i){
cout<<i<<" : "<<stod(positions_str[i])<<endl;
}
控制台输出:
Position in double format using stod() :
0 : 1
1 : 2
2 : 3
3 : 4
terminate called after throwing an instance of 'std::invalid_argument'
what(): stod
Abandon (core dumped)
stod() 似乎不能抓住要点...我也尝试了 strtod() 和 atof(),我最后 4 个值 return 0。
但是当我自己输入值时,它起作用了。
代码:
cout<<"Results of these 3 functions when I type the string values by hand : "<<endl;
positions_str = {"1", "2", "3", "4", "0.0509105", "-0.0101653", "-0.105985", "-0.0534463"};
cout<<"stod() : strtod() : atof() : "<<endl;
char* end_strtod;
for(int i = 0; i<=nb_of_variables-1; ++i){
cout<<stod(positions_str[i])<<" ; "<<strtod(positions_str[i].c_str(), &end)<<" ; "<<atof(positions_str[i].c_str())<<endl;
}
控制台输出:
Results of these 3 functions when I type the string values by hand :
stod() : strtod() : atof() :
1 ; 1 ; 1
2 ; 2 ; 2
3 ; 3 ; 3
4 ; 4 ; 4
0.0509105 ; 0.0509105 ; 0.0509105
-0.0101653 ; -0.0101653 ; -0.0101653
-0.105985 ; -0.105985 ; -0.105985
-0.0534463 ; -0.0534463 ; -0.0534463
我把我为 strtod 和 atof 编写的代码以及函数定义放在那里。
代码:
cout<<"Position in double format using strtod() : "<<endl;
char* end;
for(int i = 0; i<=nb_of_variables-1; ++i){
cout<<i<<" : "<<strtod(positions_str[i].c_str(), &end)<<endl;
}
cout<<"Position in double format using atof() : "<<endl;
for(int i = 0; i<=nb_of_variables-1; ++i){
cout<<i<<" : "<<atof(positions_str[i].c_str())<<endl;
}
控制台输出:
Position in double format using strtod() :
0 : 1
1 : 2
2 : 3
3 : 4
4 : 0
5 : 0
6 : 0
7 : 0
Position in double format using atof() :
0 : 1
1 : 2
2 : 3
3 : 4
4 : 0
5 : 0
6 : 0
7 : 0
非常感谢那些花时间回答的人。
在调用 std::stod.
之前,您需要从字符串的开头和结尾删除"
将您的转换代码更改为:
for (auto &s : positions_str)
s.erase(remove(s.begin(), s.end(), '\"'), s.end()); // this will remove double quotes from the string if present
cout << "Position in double format using stod() : " << endl;
for(int i = 0; i < positions_str.size(); ++i)
cout << i << " : " << stod(positions_str[i]) << endl;
好吧,您应该在使用文本编辑器打开 csv
文件后发布了它的内容。
结构是这样的:
1,2,3,4,"0.0509105","-0.0101653","-0.105985","-0.0534463","Joint Positions"
前四列为数字类型等一般或字符串。
如果前四个带有 "
,那么您将不会获得索引 0 - 3
的结果。