简体   繁体   English

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

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

I have been trying to read data from a text file which contains float data in two columns我一直在尝试从包含两列浮点数据的文本文件中读取数据

1 2
3 4
4.5 6.5
2 4

Now, I have tried the methods of several questions in stackoverflow like this , this and some others.现在,我已经尝试过stackoverflow中几个问题的方法,比如thisthis和其他一些。 The final code that I have written is:我写的最终代码是:

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

But it doesn't seem to work.但这似乎不起作用。 What can I do read the data in vectors?如何读取向量中的数据?

(Update): All you need is: (更新):您只需要:

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

Adding my variant with error checking (you will need to replace the exception types).添加带有错误检查的变体(您将需要替换异常类型)。 Using trim from here: What's the best way to trim std::string?从这里使用修剪: 修剪 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 != '\0') {
      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 != '\0') {
      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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM