【问题标题】:Writing binary files in python to be read by C在python中编写二进制文件以供C读取
【发布时间】:2013-03-26 22:19:01
【问题描述】:

我必须使用一个用 C 语言编写的程序,以这种方式从二进制文件中读取数据

nCnt = 0;
for (i=0;i<h.nsph;++i) {
    fread(&gp,sizeof(struct gas_particle),1,fp);
    if (bGas) {
        kd->p[nCnt].iOrder = nCnt;
        for (j=0;j<3;++j) kd->p[nCnt].r[j] = gp.pos[j];
        ++nCnt;
        }

    }

上面的代码不是我正在使用的程序的全部代码,而只是与我的问题相关的部分。我需要读取nCnt 粒子的位置,即每个粒子的坐标。 我在 python 数组中有这些位置,看起来像这样

 pos=array([[[ 0.4786236 ,  0.49046784,  0.48877147],
    [ 0.47862025,  0.49042325,  0.48877267],
    [ 0.47862737,  0.49039413,  0.4887735 ],
    ..., 
    [ 0.4785084 ,  0.49032556,  0.48860968],
    [ 0.47849332,  0.49041115,  0.48877266],
    [ 0.47849161,  0.49041022,  0.48877176]]])

我应该如何在二进制文件中写入这个数组,以便 C 代码可以很好地读取它?

【问题讨论】:

  • 大概是numpy数组吧?
  • 你检查过这个:stackoverflow.com/questions/807863/…(建议的解决方案使用docs.python.org/2/library/array.html)?
  • 您不想为了通用性对数据进行字符串化吗?例如,您可以将其存储在 JSON 中,在这种情况下,您将不依赖字节序或位。
  • 您应该显示struct gas_particle 的声明。此外,fread()(与所有 I/O 一样)可能会失败,应检查返回值。

标签: python c binary


【解决方案1】:

使用python模块arraytofile() method以C可以读取的格式或IO routines if you use numpy写入数据。

有了位数,'f' 格式(浮点数)应该可以工作。

在 C 中,您可以像这样读取每一行:

float values[3];
fread( values, sizeof( float ), 3, fh );

【讨论】:

  • @unwind:具体什么不是 C?
  • 现在好多了,values 的奇怪声明已修复。尽管如此,它仍然缺少fread() 的参数,并且存在的参数以错误的顺序给出。
  • 为什么答案包括任何 C 呢? OP 说他必须使用已经编写好的 C 程序。
  • @JohnY:啊,我不知怎的错过了。
  • 删除了我的反对票,因为至少会建立 fread() 电话。 :)
猜你喜欢
  • 1970-01-01
  • 2019-03-27
  • 2010-12-13
  • 1970-01-01
  • 2012-02-16
  • 2012-07-12
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
相关资源
最近更新 更多