Заполнение массива из файла .txt

Я пытаюсь заполнить массив из .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

Решение

Вот более компактная версия чтения в 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;
}

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

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

3

Другие решения

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

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