Search code examples
c++text-filesfstream

How to assign each row of a text file to a new vector?


I am C++ noob, I have a text file with 4 rows and 3 columns, where each row corresponds to a sensor signal. How do I load each row to a separate vector<float>?

(0.165334,0) (0.166524,-0.0136064) (-0.144899,0.0207161)
(0.205171,0) (0.205084,-0.0139042) (-0.205263,0.0262445)
(0.216684,0) (0.215388,-0.0131107) (-0.193696,0.0251303)
(0.220137,0) (0.218849,-0.0135667) (-0.194153,0.025175) 

This is what I have so far, but this code loads data as string. I want to load my final data as vector<vector<float>>?

vector<vector<string> > input;    
ifstream fileFFT(Filename.c_str());
string line;
while(getline(fileFFT, line)){
    if(line.empty()){
        continue;
    }

    stringstream row(line);
    vector<string> values((istream_iterator<string>(row)),(istream_iterator<string>()));       //end

    input.push_back(values);

}

Solution

  • Here's something to get you started:

    class Point
    {
    public:
      double x;
      double y;
      friend std::istream& operator>>(std::istream& input, Point& p);
    };
    
    std::istream& operator>>(std::istream& input, Point& p)
    {
      char c;
      input >> c; // Read open parenthesis
      input >> p.x;
      input >> c; // Read comma
      input >> p.y;
      input >> c; // Read closing parenthesis
      return input;
    };
    
    //...
    std::string row_text;
    std::vector<std::vector<Point>> matrix;
    while (std::getline(my_file, row_text))
    {
      std::vector<Point> row;
      std::istringstream(row_text);
      Point p;
      while (row_text >> p)
      {
        row.push_back(p);
      }
      matrix.push_back(row);
    }
    

    I've created a Point class to represent the pair of floating point numbers.

    I also overloaded operator>> to make reading a Point easier.

    The loop reads one record or text line, then creates a vector of Point from the text line.
    The record or row is then appended to the matrix.