Чтение файла, начинающегося с определенной строки, в вектор пар - PullRequest
0 голосов
/ 05 января 2019

Вот мой фрагмент текста в формате txt, в котором перечислены температура, напряжение и чувствительность

Temp.      Voltage    Sensitivity
(Kelvin)   (Volts)    (milliVolts/Kelvin)

1.4     1.644290        -12.5
1.5     1.642990        -13.6
1.6     1.641570        -14.8
1.7     1.640030        -16.0
1.8     1.638370        -17.1

То, что я пытаюсь сделать, это прочитать значения для Temp и Voltage в вектор пар, чтобы, если посмотреть на Temp, я смог найти соответствующее напряжение. Будет ли проще / эффективнее создать два отдельных вектора и просто найти соответствующее значение в зависимости от его положения?

void Convert::readFile()
{
    ifstream inFile;
    vector<double> temp,voltage;
    double kelvin,mV;

    inFile.open("DT-670.txt");
    if (inFile) {
        cout << "File Open";

        while(inFile>>kelvin && inFile>> mV)
        {
            temp.push_back(kelvin);
            voltage.push_back(mV);
        }

        cout<<temp.size();

    }

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Если вы не собираетесь использовать данные о чувствительности, вы можете сделать что-то вроде этого:

std::map<double, double> table;
//...
double temperature = 0.0;
double voltage = 0.0;
double sensitivity = 0.0;
while (file >> temperature >> voltage >> sensitivity)
{
  table[temp] = voltage;
}

Здесь существует фундаментальная проблема использования значения с плавающей запятой в качестве ключа поиска. Значения с плавающей точкой по их внутреннему представлению не могут быть представлены точно; таким образом operator== может работать некорректно для всех значений.

Чтобы обойти проблему равенства, большинство программ используют эквивалентность или epsilon для определения равенства. Например, если разница между двумя значениями с плавающей запятой меньше 1E-6, считайте их равными. Я рекомендую изучить std::map, чтобы увидеть, как перегрузить оператор сравнения (или предоставить функцию для сравнения значений).

0 голосов
/ 05 января 2019

Вот пример кода, вы можете изменить номер строки и включить условное выполнение

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

using namespace std;

int main() {
  ifstream file("data.txt");
  string str = "";
  string::size_type sz;

  uint32_t line_number = 4;

  while (std::getline(file, str)) {
    cout << str << endl;

    istringstream buf(str);
    istream_iterator<string> beg(buf), end;

    vector<string> tokens(beg, end);

    for (auto &s : tokens)
      cout << atof(s.c_str()) << " " << flush;

    cout << endl;
  }
}
...