代码之家  ›  专栏  ›  技术社区  ›  Spandyie

如何将文本文件的每一行分配给一个新的向量?

  •  0
  • Spandyie  · 技术社区  · 7 年前

    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) 
    

    这是我到目前为止得到的,但这段代码将数据作为字符串加载。我想将最终数据加载为 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);
    
    }
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   Thomas Matthews    7 年前

    以下是让您开始学习的内容:

    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);
    }
    

    我创建了一个 Point

    我也超载了 operator>> 使阅读成为 指向

    循环读数为1 或文本行,然后创建 指向

        2
  •  2
  •   Remy Lebeau    7 年前

    你已经有一半的答案了-使用 std::getline() 阅读每一行,然后使用 std::(i)stringstream

    std::istream_iterator ,我会这样做:

    typedef std::pair<float, float> SensorValue;
    typedef std::vector<SensorValue> SensorValues;
    
    std::istream& operator>>(std::istream &in, SensorValue &out)
    {
        float f1, f2;
        char ch1, ch2, ch3;
    
        if (in >> ch1 >> f1 >> ch2 >> f2 >> ch3)
        {
            if ((ch1 == '(') && (ch2 == ',') && (ch3 == ')'))
                out = std::make_pair(f1, f2);
            else
                in.setstate(std::ios_base::failbit);
        }
    
        return in;
    }
    
    ...
    
    std::vector<SensorValues> input;
    
    std::ifstream fileFFT(Filename.c_str());
    std::string line;
    
    while (std::getline(fileFFT, line))
    {
        if (line.empty())
            continue;
    
        std::istringstream row(line);
    
        SensorValues values;
        std::copy(std::istream_iterator<SensorValue>(row), std::istream_iterator<SensorValue>(), std::back_inserter(values));
    
        input.push_back(values);
    }