Я пытаюсь заполнить массив из .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 изображения. Я взял одно изображение и преобразовал его в значения, используя этот бит кода выше. Однако теперь я пытаюсь сохранить данные, которые я читаю, в общедоступный двумерный массив?
Вот более компактная версия чтения в 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
уменьшается как проверка безопасности для предотвращения переполнения буфера.
Предполагая, что каждый возвращенный двойник представляет пиксель. Вы можете определить функцию, которая получает пиксели следующим образом:
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);