首页 > 解决方案 > 将 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 代码中读取它。我想使用尽可能少的外部库来做到这一点,因为代码的目的是让它公开起来很容易使用。有任何想法吗 ?

我一直在数据错误中运行,我的 c++ 代码从 bin 文件中读取了似乎完全错误的数字。但是,第二部分(python 从 c++ 生成的 bin 中读取修改后的数据)似乎有效。

我目前正在做的是使用 pickle 将数据转储到 bin 中,然后我在 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;
}

打印结果错误。

谢谢你的帮助。

标签: c++python-3.xtypesbin

解决方案


所以考虑 Python 数据数组

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

要在 C++ 中导入的二维数组。问题已经是数据类型了:

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

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

如果要将其导入浮点数组,则需要将所有内容转换为浮点数。您可以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++ 中,我们现在可以使用 filestream 从文件中读取浮点数

#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

这只是概念的证明。当然,这可以做得更好......


推荐阅读