C ++, как преобразовать строку строка за строкой, чтобы удвоить - PullRequest
0 голосов
/ 16 октября 2018

Моя строка выглядит следующим образом:

89.800000
89.800000
91.840000
87.760000
60.500000

И мне нужно разделить ее на двойной массив.

double* data = new double[20];

Мне нужно прочитать строку за строкой и преобразовать ее в двойной массив,Пожалуйста помоги.Спасибо.

Почему это вне диапазона?Пожалуйста помоги.Вот если (data.at (i) <минимум) </p>

string vyhodnoceni(string nazev_souboru, double &minimum) { // vyhodnocuje volné místo na disku
    string alarm;
    string s = vypocet2(nazev_souboru);
    string st = s + "\n";
    //cout << st;
    bool dataok = true;
    bool bad = false;

    vector<string>::iterator a;
    istringstream sin(st);
    vector<double> data;
    double next = 0.0;
    while (sin >> next) {
        data.push_back(next);
    }
    process(data);

    for (size_t i = 0; i <= data.max_size(); i++)
    {
        if (data.at(i) < minimum)
        {
            dataok = false;
        }
        else
        {

        }

        if (data.at(i) == 0)
        {
            bad = true;
        }
    }

    if ((vypocet(nazev_souboru) < minimum) || (dataok == false)) {
        alarm = "LDS";
    }
    else alarm = "OK";

    if ((vypocet(nazev_souboru) == 0) || (bad == true)){
        alarm = "UER";
    }

    return alarm;
}

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018
                istringstream sin(st);
                vector<double> data;
                double next = 0.0;
                bool tecmez = false;
                vector<string> vstr;

                while (sin >> next) {
                    ostringstream strs;
                    strs << next;
                    string str = strs.str();
    data.push_back(next);
}
0 голосов
/ 04 декабря 2018

Прежде всего вы действительно захотите использовать vector, а не массив ... Что, я вижу, вы уже делаете, но вы можете сделать это немного чище, используя istream_iterator:

vector<double> data { istream_iterator<double>(sin), istream_iterator<double> {} }

Что касается оценки вне диапазона, вы можете легко оценить, есть ли какие-либо элементы меньше minimum, используя any_ofи лямбда-выражение или оператор связывания, например:

any_of(cbegin(data), cend(data), bind(less<double>(), placeholder::_1, minimum))

Живой пример

0 голосов
/ 16 октября 2018

Если ваш ввод из строки:

#include <iostream>
#include <sstream>
#include <vector>

void process(const std::vector<double>& data) {
  for (const double x : data) {
    std::cout << x << std::endl;
  }
}

int main() {
  std::string input = "89.800000\n 91.840000";
  std::istringstream sin(input);
  std::vector<double> data;
  double next = 0.0;
  while (sin >> next) {
    data.push_back(next);
  }
  if (!sin.eof()) {
    std::cerr << "Warning: encountered non-double value." << std::endl;
  }
  process(data);
  return 0;
}

Если ваш ввод из файла "input.txt":

#include <fstream>
#include <vector>

int main() {
  std::ifstream fin("input.txt");
  std::vector<double> data;
  double next = 0.0;
  while (fin >> next) {
    data.push_back(next);
  }
  if (!fin.eof()) {
    std::cerr << "Warning: encountered non-double value." << std::endl;
  }
  process(data);
  return 0;
}
...