How to read a file as a vector <vector <double>>?
I have such data
4.0 0.8 4.1 0.7 4.4 1.1 3.9 1.2 4.0 1.0 I wrote my program
#include <string> #include <iostream> #include <fstream> #include <vector> using namespace std; int main() { vector<double> v; ifstream in("primer.dat"); double word; while(in >> word) v.push_back(word); for(int i = 0; i < v.size(); i++) cout << v[i] << endl; } But now I realized that for further calculations in my code I need data like ( vector <vector> double) . I would prefer not to change the shape of the vector. Is it possible to read data as a vector of vectors?
+4
3 answers
Try to execute
#include <iostream> #include <fstream> #include <vector> #include <iterator> #include <sstream> #include <string> int main() { std::vector<std::vector<double>> v; std::ifstream in( "primer.dat" ); std::string record; while ( std::getline( in, record ) ) { std::istringstream is( record ); std::vector<double> row( ( std::istream_iterator<double>( is ) ), std::istream_iterator<double>() ); v.push_back( row ); } for ( const auto &row : v ) { for ( double x : row ) std::cout << x << ' '; std::cout << std::endl; } } +5
Not sure if I fully understand what you meant, but if I did this code, it should work fine:
#include <string> #include <iostream> #include <fstream> #include <vector> #include <sstream> using namespace std; std::vector<std::string> split(const std::string& str, char sep) { std::vector<std::string> result; std::istringstream iss(str); std::string sub; while (std::getline(iss, sub, sep)) result.push_back(sub); return result; } int main() { vector<vector<double> > completeVector ; ifstream in("primer.dat"); string word; while(in >> word){ std::vector<std::string> splitS = split(word, ' '); std::vector<double> line ; for(int i = 0 ; i < splitS.size() ; i++){ line.push_back(stod(splitS[i])); } completeVector.push_back(line); } // For printing out the result for(int i = 0 ; i < completeVector.size() ; i++){ std::vector<double> tmp = completeVector[i]; for(int j = 0 ; j < tmp.size() ; j++){ std::cout << tmp[j] << std::endl ; } } } It compiles for sure, and it must have the behavior you are looking for. If this does not let me know in the comments.
+4
#include <string> #include <sstream> #include <iostream> #include <fstream> #include <vector> using namespace std; int main() { vector<vector<double>> v; ifstream in("primer.dat"); string line; while(std::getline(in, line)) { v.push_back(vector<double>()); stringstream ss(line); double word; while(ss >> word) { v.back().push_back(word); } } for(int i = 0; i < v.size(); i++) { for(int j = 0; j < v[i].size(); j++) { cout << v[i][j] << ' '; } cout << endl; } } 0