Читать данные Python в код C ++

Я обновляю код Python и код C ++, чтобы второй мог читать данные, полученные от первого, использовать его для запуска перед повторной отправкой обновленных данных в исходный код Python.
Точнее:
— Мой файл python составляет список данных [2] [5]:

data = [[Cij[0, 0],Cij[0,1],Cij[0,2],Cij[2,2],Cij[3,3]],[50,50,100,100,0]]

Cij является плавающим, и я хочу сохранить его в bin-файле, открыть его на C ++ и получить доступ к этим данным, чтобы изменить его.
Затем я сохраняю эти измененные данные в другой bin-файл, чтобы прочитать его в моем коде python.
Я хочу сделать это, используя как можно меньше внешних библиотек, поскольку цель кода — сделать его общедоступным. Есть идеи ?

Я работал с ошибками данных, мой код на С ++ читал то, что в бин-файле кажется совершенно неправильным числом. Однако вторая часть (чтение на Python измененных данных из бина, сгенерированного с ++), похоже, работает.

В настоящее время я использую pickle для выгрузки данных в корзину, а затем я получаю к ним доступ на c ++, выполняя:

DataFile.open('Binpath', ios::binary|ios::in);
float data[2][5];
DataFile.read((char*)&data,sizeof(data));

Но когда я печатаю данные в файле C ++, это совершенно неправильно.

Итак, вот полный пример:
В питоне я пишу:

import pickle
data = [[1.1, 1.1, 1.1, 1.1], [2.2, 2.2, 2.2, 2.2]]
outfile = open("test.bin", 'wb')
pickle.dump(data, outfile)
outfile.close()

и в с ++:

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main() {
ifstream DataFile;
DataFile.open("test.bin", ios::binary|ios::in);
if(!DataFile.is_open()){
cout<< "error"<<endl;
}
float data[2][4] = {{0.0,0.0,0.0,0.0},{0.0,0.0,0.0,0.0}};
DataFile.read((char*)&data,sizeof(data));

for (int i = 0; i<4; i++){
cout << data[0][i]<< endl;}
for (int i = 0; i<4; i++){
cout << data[1][i]<< endl;}
cin.ignore();
DataFile.close();
return 0;
}

результаты печати неверны.

Спасибо за любую помощь.

0

Решение

Итак, рассмотрим массив данных Python

data = [[0.1, 0.2, 0.3, 0.4, 0.5], [50, 50, 100, 100, 0]]

2D массив, который вы хотите импортировать в C ++. Проблема уже в типах данных:

type(data[0][0])
Out[6]: float

type(data[1][0])
Out[7]: int

Вам нужно будет преобразовать все в float, если вы хотите импортировать его в массив float. Вы можете использовать array пакет для этого. Однако нам придется сгладить массив так, как в C ++ хранится многомерный массив:

from array import array
dataArray = array('f', [item for sublist in data for item in sublist])
outputFile = open('outData', 'wb')
dataArray.tofile(outputFile)
outputFile.close()

В C ++ теперь мы можем читать числа из файла, используя файловый поток

#include <fstream>
#include <iostream>

int main()
{
float data[2][5];
std::ifstream dataFile;
dataFile.open("outData", std::ios::binary | std::ios::in);
dataFile.read((char*)&data, sizeof(data));
dataFile.close();

for (int i = 0; i < 2; i++)
for (int j = 0; j < 5; j++)
std::cout << "(" << i << ", " << j << ") = " << data[i][j] << "\n";
return 0;
}

Выход

(0, 0) = 0.1
(0, 1) = 0.2
(0, 2) = 0.3
(0, 3) = 0.4
(0, 4) = 0.5
(1, 0) = 50
(1, 1) = 50
(1, 2) = 100
(1, 3) = 100
(1, 4) = 0

Это просто подтверждение концепции. Это может быть сделано намного лучше, конечно …

0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector