将字符串向量转换为双精度向量的问题
Problem with converting vector of string to vector of doubles
我正在尝试编写一个程序,从 .csv
文件中读取一些数值,将它们存储在 std::vector<std::string>
中,然后将这些值转换为 double
并存储他们在 std::vector<double>
.
我正在尝试使用 stringstream
s 进行转换,这在过去对我来说效果很好。
我已经设法导入数值并将它们存储在 std::vector<std::string>
中,但是在尝试转换为 double
时我遇到了一个奇怪的问题。只有第一个值存储在 std::vector<double>
中,缺少很多有效数字,其他条目将被忽略,根本不存储在 std::vector<double>
中。
到目前为止,这是我的代码:
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
double extract_double(std::string str)
{
std::stringstream ss;
double grade;
//Pass all the course details to string stream
ss << str;
//Extract the double type part of the string stream which is the course grade
ss >> grade;
str = "";
ss.ignore();
return grade;
}
int main()
{
std::ifstream my_input_file;
std::string file_name;
my_input_file.open("scale_free_gamma_2_fitnesses.csv");
int number_of_data_in_file;
std::vector<std::string> fitnesses_string;
std::vector<double> fitnesses;
std::string string_temp;
while (my_input_file.good()) {
//Extract strings from file
std::getline(my_input_file, string_temp, ',');
fitnesses_string.push_back(string_temp);
}
for (auto fitnesses_it = fitnesses_string.begin();
fitnesses_it < fitnesses_string.end(); ++fitnesses_it){
fitnesses.push_back(extract_double(*fitnesses_it));
}
for (auto fitnesses_itt = fitnesses.begin();
fitnesses_itt < fitnesses.end(); ++fitnesses_itt){
std::cout << *fitnesses_itt << std::endl;
}
return 0;
}
几件事。首先,有一种更好的方法来遍历向量。
for (const std::string &str: fitnesses_string) {
}
这些被称为基于范围的 for 循环,我想您可以看到这种语法是多么清晰。在现代 C++ 中,您很少需要再使用迭代器。 (我不会说永远不会,但很少。)
接下来,你的内循环完全没有意义。相反,只需简单地做:
for (const std::string &str: fitnesses_string) {
fitnesses.push_back(extract_double(str));
}
现在,我们来谈谈如何将字符串转换为双精度值。
fitnesses.push_back(std::stod(str));
所以你不需要你的方法。已经有一个方法在等着你。它在 #include <string>
.
中定义
您应该先从文件中读取单独的行,然后用逗号分隔每一行。
还有更简单的方法来处理其余代码。
尝试更像这样的东西:
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
int main()
{
std::ifstream my_input_file("scale_free_gamma_2_fitnesses.csv");
std::vector<std::string> fitnesses_string;
std::vector<double> fitnesses;
std::string line, string_temp;
while (std::getline(my_input_file, line)) {
//Extract strings from line
std:::istringstream iss(line);
while (std::getline(iss, string_temp, ','))
fitnesses_string.push_back(string_temp);
}
for (const auto &s : fitnesses_string){
fitnesses.push_back(std:stod(s));
}
for (auto value : fitnesses){
std::cout << value << std::endl;
}
return 0;
}
在这种情况下,更简单的方法是完全摆脱 std::vector<std::string>
:
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
int main()
{
std::ifstream my_input_file("scale_free_gamma_2_fitnesses.csv");
std::vector<double> fitnesses;
std::string line, string_temp;
while (std::getline(my_input_file, line)) {
//Extract strings from line
std:::istringstream iss(line);
while (std::getline(iss, string_temp, ','))
fitnesses.push_back(std:stod(string_temp));
}
for (auto value : fitnesses){
std::cout << value << std::endl;
}
return 0;
}
我正在尝试编写一个程序,从 .csv
文件中读取一些数值,将它们存储在 std::vector<std::string>
中,然后将这些值转换为 double
并存储他们在 std::vector<double>
.
我正在尝试使用 stringstream
s 进行转换,这在过去对我来说效果很好。
我已经设法导入数值并将它们存储在 std::vector<std::string>
中,但是在尝试转换为 double
时我遇到了一个奇怪的问题。只有第一个值存储在 std::vector<double>
中,缺少很多有效数字,其他条目将被忽略,根本不存储在 std::vector<double>
中。
到目前为止,这是我的代码:
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
double extract_double(std::string str)
{
std::stringstream ss;
double grade;
//Pass all the course details to string stream
ss << str;
//Extract the double type part of the string stream which is the course grade
ss >> grade;
str = "";
ss.ignore();
return grade;
}
int main()
{
std::ifstream my_input_file;
std::string file_name;
my_input_file.open("scale_free_gamma_2_fitnesses.csv");
int number_of_data_in_file;
std::vector<std::string> fitnesses_string;
std::vector<double> fitnesses;
std::string string_temp;
while (my_input_file.good()) {
//Extract strings from file
std::getline(my_input_file, string_temp, ',');
fitnesses_string.push_back(string_temp);
}
for (auto fitnesses_it = fitnesses_string.begin();
fitnesses_it < fitnesses_string.end(); ++fitnesses_it){
fitnesses.push_back(extract_double(*fitnesses_it));
}
for (auto fitnesses_itt = fitnesses.begin();
fitnesses_itt < fitnesses.end(); ++fitnesses_itt){
std::cout << *fitnesses_itt << std::endl;
}
return 0;
}
几件事。首先,有一种更好的方法来遍历向量。
for (const std::string &str: fitnesses_string) {
}
这些被称为基于范围的 for 循环,我想您可以看到这种语法是多么清晰。在现代 C++ 中,您很少需要再使用迭代器。 (我不会说永远不会,但很少。)
接下来,你的内循环完全没有意义。相反,只需简单地做:
for (const std::string &str: fitnesses_string) {
fitnesses.push_back(extract_double(str));
}
现在,我们来谈谈如何将字符串转换为双精度值。
fitnesses.push_back(std::stod(str));
所以你不需要你的方法。已经有一个方法在等着你。它在 #include <string>
.
您应该先从文件中读取单独的行,然后用逗号分隔每一行。
还有更简单的方法来处理其余代码。
尝试更像这样的东西:
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
int main()
{
std::ifstream my_input_file("scale_free_gamma_2_fitnesses.csv");
std::vector<std::string> fitnesses_string;
std::vector<double> fitnesses;
std::string line, string_temp;
while (std::getline(my_input_file, line)) {
//Extract strings from line
std:::istringstream iss(line);
while (std::getline(iss, string_temp, ','))
fitnesses_string.push_back(string_temp);
}
for (const auto &s : fitnesses_string){
fitnesses.push_back(std:stod(s));
}
for (auto value : fitnesses){
std::cout << value << std::endl;
}
return 0;
}
在这种情况下,更简单的方法是完全摆脱 std::vector<std::string>
:
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
int main()
{
std::ifstream my_input_file("scale_free_gamma_2_fitnesses.csv");
std::vector<double> fitnesses;
std::string line, string_temp;
while (std::getline(my_input_file, line)) {
//Extract strings from line
std:::istringstream iss(line);
while (std::getline(iss, string_temp, ','))
fitnesses.push_back(std:stod(string_temp));
}
for (auto value : fitnesses){
std::cout << value << std::endl;
}
return 0;
}