(C++) 如何将.txt 文件中的两列数据读取到两个向量中?

(C++) How to read two columns of data from .txt file into two vectors?

我一直在尝试从包含两列浮点数据的文本文件中读取数据

1 2
3 4
4.5 6.5
2 4

现在,我尝试了this, this等Whosebug中几个问题的方法。我写的最终代码是:

#include<iostream>
#include<fstream>
#include<string>
#include<vector>

using namespace std;


int main()
{
    vector<float> a, b;

    fstream file;
    file.open("sample.txt", ios::in);
    if(!file){
        cout << "Error" <<endl;
        return 0;
    }
    
    int number_of_lines = 0;
    string line;

    while(getline(file,line))
    {   
        file >> a[number_of_lines];
        file >> b[number_of_lines];
    }

    cout << number_of_lines << endl;

    for (int i = 0; i < number_of_lines; i++) //code to print out the vectors
    {
        cout << a[i] << " " << b[i] <<endl;
    }

    return 0;
}

但是好像不行。如何读取向量中的数据?

(更新):您只需要:

float ai, bi;
while (file >> ai >> bi) {
  a.push_back(ai);
  b.push_back(bi);
  number_of_lines++;
}

通过错误检查添加我的变体(您将需要替换异常类型)。从这里使用 trim:What's the best way to trim std::string?.

// trim from start (in place)
static void ltrim(std::string &s) {
    s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) {
        return !std::isspace(ch);
    }));
}


// trim from end (in place)
static void rtrim(std::string &s) {
    s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) {
        return !std::isspace(ch);
    }).base(), s.end());
}


// trim from both ends (in place)
static void trim(std::string &s) {
    ltrim(s);
    rtrim(s);
}


std::vector<std::vector<double>> load_dat_file(const std::string& file_name) {
  std::vector<std::vector<double>> res;

  ifstream fin;
  fin.open(file_name, ios::in);

  int linenr = 1;
  string line;
  while(getline(fin, line)) {
    // is only whitespace? -> skip
    trim(line);
    if (line == "") {
      continue;
    }

    size_t pos = line.find_first_of(" \t");
    if (pos == string::npos) {
      throw RuntimeError("Invalid format of input file " + file_name +
          ", did not find a column separator on line " + to_string(linenr) + ".");
    }

    string col1 = line.substr(0, pos);
    string col2 = line.substr(pos + 1);

    char* end;
    errno = 0;
    double col1_value = strtod(col1.c_str(), &end);
    if (errno != 0 || *end != '[=10=]') {
      throw RuntimeError("Invalid format of input file " + file_name +
          ", could not convert value in the first column " + col1 + " to a float, error on line " + to_string(linenr) + ".");
    }

    errno = 0;
    double col2_value = strtod(col2.c_str(), &end);
    if (errno != 0 || *end != '[=10=]') {
      throw RuntimeError("Invalid format of input file " + file_name +
          ", could not convert value in the second column " + col2 + " to a float, error on line " + to_string(linenr) + ".");
    }

    res.push_back(std::vector<double>());
    res.back().push_back(col1_value);
    res.back().push_back(col2_value);

    linenr++;
  }

  return res;
}