Заполнение массива из файла .txt - PullRequest
0 голосов
/ 05 декабря 2018

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

double* read_text(const char *fileName, int sizeR, int sizeC)
{
    double* data = new double[sizeR*sizeC];
    int i = 0;
    ifstream myfile(fileName);
    if (myfile.is_open())
    {

        while (myfile.good())
        {
            if (i > sizeR*sizeC - 1) break;
            myfile >> *(data + i);
            //cout << *(data + i) << ' '; // Displays converted data.
            i++;
        }
        myfile.close();
    }

    else cout << "Unable to open file";
    //cout << i;

    return data;
}

Теперь, когда я читаю файл, я пытаюсь взять элементы из массива данных 1D и сохранить их в 2Dмассив.

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

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

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Предполагая, что каждый возвращенный двойник представляет пиксель.Вы можете определить функцию, которая извлекает пиксели следующим образом:

double get_pixel(int x, int y, double* data, int sizeC)
{
    return data[x + y*sizeC];
}

Где sizeC - ширина изображения (количество столбцов).

Затем можно использовать функцию выше длязаполните свой 2D массив следующим образом:

for(int i = 0; i < sizeC; i++)
    for(int j = 0; j < sizeR; j++)
        my2Darray[i][j] = get_pixel(i, j, data, sizeC);

Но затем обратите внимание, насколько это ненужно.Вам не нужен 2D-массив :), сделайте его простым и эффективным.

Вышеприведенная функция может быть частью структуры, представляющей изображение, где вы будете иметь sizeC, sizeR и данные, определенные как члены.

struct Image
{
    int sizeC;
    int sizeR;
    double* data;

    get_pixel(int x, int y)
    {
        return data[x + y*sizeC];
    }
};

Затем для доступа к пикселям изображения, которые выможно просто сделать:

Image img;
// read image data and stuff
double p = img.get_pixel(4, 2);

Вы даже можете сделать его более красивым, переопределив оператор () вместо get_pixel, поэтому получение пикселя будет выглядеть примерно так:

double p = img(4, 2);
0 голосов
/ 05 декабря 2018

Вот более компактная версия чтения в 2D-матрице:

int quantity = sizeR * sizeC;
double * matrix = new double [quantity];
double value = 0.0;
double * p_cell = matrix;
//...
while ((myfile >> value) && (quantity > 0))
{
  *p_cell++ = value;
  --quantity;
}

В приведенном выше фрагменте кода указатель используется для указания следующего слота или ячейки матрицы (2D-массив),Указатель увеличивается после каждого чтения.

quantity уменьшается как проверка безопасности для предотвращения переполнения буфера.

...