Читать данные Python в код C ++ - PullRequest
0 голосов
/ 13 июня 2018

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

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

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

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

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

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

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()

и в c ++:

#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;
}

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

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

1 Ответ

0 голосов
/ 13 июня 2018

Итак, рассмотрим массив данных 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

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

...