Я обновляю код 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;
}
результаты печати неверны.
Спасибо за любую помощь.
Итак, рассмотрим массив данных 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
Это просто подтверждение концепции. Это может быть сделано намного лучше, конечно …
Других решений пока нет …