【问题标题】:Save data in C and load it in Python [closed]在 C 中保存数据并在 Python 中加载它[关闭]
【发布时间】:2019-12-03 11:56:01
【问题描述】:

我正在尝试用 Python 生成代码,并将 C 程序的变量作为输入提供。我怎么能这样做?

如果在 Python 中的两个代码我可以使用“pickle”来存储第一个的信息,然后在第二个中读取它。但是对于我一直在阅读的内容,没有类似 pickle 的方式用 C 来做(如果我错了,请纠正我,因为我对 C 几乎一无所知),即使存在这样的方式,我也不确定将它“导入”到 Python 的正确方法。

我需要保存的数据是一个“双精度数组”,实际上是内存的动态分配。

顺便说一句:我现在正在做的是获取输出的打印,将其保存到文件并在 python 中读取它,但是由于打印时的舍入,我失去了小数精度。

【问题讨论】:

  • 你不能只用 python 的print more precise data 吗?
  • 现在很难说出你的问题到底是什么。除非您的 C 实现真的很差,否则它应该以唯一标识所述double 的二进制表示所需的完整精度打印double 值,即循环(阅读double回)不应该失去任何精度。你能想出一个小例子、观察到的结果和预期的结果吗?因为我有一种预感,你的期望在某些时候是错误的......
  • @FedericoklezCulloca:他是从 C 语言而不是 Python 语言打印。但是,是的,该问题/答案涉及相同的问题-“错误精度”,当您认为较长的小数“更好”时,最终,四舍五入的小数与唯一标识相同的位模式一样。
  • 在 C 中使用 fwrite 将双数组原样转储到二进制文件中,然后在 Python 中使用 struct.unpack 对其进行解码不是最简单的吗?
  • @DevSolar 对,我很困惑。我将“作为 C 程序的变量的输入”读作“作为 C 程序 to 的变量的输入”。

标签: c python-3.x


【解决方案1】:

您可以使用 struct.pack 函数在 python 中序列化数据,然后在 C 中您可以使用联合数据类型再次解包此信息。我将提供两种语言的简短代码,说明如何完成这两个部分。反过来也是可能的,如果你需要的话,你自己应该很容易做到。请记住,当您发送双精度而不是浮点数时,您每次需要在 C 代码中读取 8 个字节。

在 Python 中:

import struct

doublesArray = [5.0, 1.2, 3.4, 8.6]

file = open("transferdata", "wb")
for i in range(len(doublesArray)):
    file.write(struct.pack('f', doublesArray[i]))

在 C 中。顺便说一下,我从 this post 获取了这段代码:

#include <stdio.h>
#include <stdlib.h>

union
{
    char asBytes[4];
    float asFloat;
} converter;

int main(void)
{
    FILE *fileptr;
    char *buffer;
    long filelen;

    fileptr = fopen("transferdata", "rb");
    fseek(fileptr, 0, SEEK_END);
    filelen = ftell(fileptr);
    rewind(fileptr);

    buffer = (char *)malloc((filelen+1)*sizeof(char)); // Enough memory for file + \0
    fread(buffer, filelen, 1, fileptr); // Read in the entire file
    fclose(fileptr);

    int i = 0;
    while(i < filelen)
    {
        converter.asBytes[0] = buffer[i];
        converter.asBytes[1] = buffer[i + 1];
        converter.asBytes[2] = buffer[i + 2];
        converter.asBytes[3] = buffer[i + 3];
        i += 4;

        char msg[32];
        snprintf(msg, 32, "%f ", converter.asFloat);
        printf(msg);
    }

    return 1;
}

[编辑]:我看到我写的与你需要的完全相反。我不是故意这样做的。但是,我认为您现在已经掌握了足够的信息来弄清楚如何自己进行反向操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2011-05-18
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2019-05-08
    相关资源
    最近更新 更多