Передача массива из txt-файла в функцию - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть простая функция вида:

double f(double x)
{
...
}

Для этой функции я хочу использовать данные из текстового файла, которые я передаю в массив:

ifstream inFile;

    inFile.open("data.txt");


    //Counting lines
    string s;
    int nlines=0;

    while(!inFile.eof()){
        getline(inFile, s);
        nlines++;
    }

    inFile.seekg(0, ios::beg);

    while(!inFile.eof()){
        inFile >> a[entry_data];
        inFile >> b[entry_data++]; 
    }

    inFile.close();

Если я помещу этот код в функцию f, каждый раз, когда вызывается функция, ей нужно будет открыть файл, создать массив ... и так далее.Я хочу избежать этого, определяя массив только при первом вызове функции или до этого.Как я могу это сделать?

Я знаю, что если я определю массив в основной области и передам его функции в качестве аргумента, я смогу решить эту проблему, но я хочу сохранить основную область как можно более чистой,Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Давайте создадим экземпляр, который будет читать ваши данные.

class DataHolder
{
    DataHolder()
    {
    ifstream inFile;

    inFile.open("data.txt");

    double v1, v2;

    while(inFile >> v1 >> v2){
        a.push_back(v1); 
        b.push_back(v2);
    }
    }
public:
    static DataHolder& getInstance()
    {
        static DataHolder d;
        return d;
    }
    std::vector<double> a, b;
};

Затем в вашей функции используйте держатель данных:

double f(double x)
{
    auto& d = DataHolder::getInstance();
    // use the holders data
}
0 голосов
/ 21 ноября 2018

Ваша f функция принимает 1 (одно) значение, а не массив.

Вы хотите использовать std::vector<double> вместо массива, если вы хотите передать данные.

Ваш цикл должен быть:

double value1, value2;
std::vector<double> a;
std::vector<double> b;
while (inFile >> value1 >> value2)
{
   a.push_back(value1);
   b.push_back(value2);
}

Вы можете использовать свою f функцию:

const size_t size = a.size();
for (size_t index = 0; index < size; ++size)
{
  double result = f(a[index]);
  //...
}

Редактировать 1: Функция для загрузки
Вы можете создать функцию ввода и вызывать ее один раз в main:

void input_data(std::istream& input, std::vector<double>& a, std::vector<double>& b)
{
  double value1, value2;
  while (input >> value1 >> value2)
  {
     a.push_back(value1);
     b.push_back(value2);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...