用Python编写二进制文件以供C读取

7
我需要使用一个用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 数组? - Martijn Pieters
1
你有检查过这个链接吗:https://dev59.com/OXRA5IYBdhLWcg3w1BqW (提供的解决方案使用了http://docs.python.org/2/library/array.html)? - furins
难道你不想将数据转换为字符串以实现普遍性吗?例如,你可以将其存储为JSON格式,这样你就不会受限于字节顺序或位数。 - Eddy_Em
2
你应该展示 struct gas_particle 的声明。另外,fread()(像所有的I/O操作一样)可能会失败,应该检查其返回值。 - unwind
1个回答

6
使用Python模块array及其tofile()方法将数据以C可读格式写入文件,或者使用IO例程(如果您使用numpy)。使用'f'格式(浮点数)应该可以解决数字位数的问题。
在C中,您可以这样读取每一行:
float values[3];
fread( values, sizeof( float ), 3, fh );

@unwind:具体来说哪些不是C语言? - Aaron Digulla
现在好多了,values 的奇怪声明已经修复了。不过,fread() 缺少一个参数,并且存在的参数顺序错误。 - unwind
为什么答案中还包括任何C呢?OP说他必须使用一个已经编写好的C程序。 - John Y
@JohnY:啊,我不知怎么错过了那个。 - Aaron Digulla
1
现在我取消了我的反对意见,因为fread()函数至少可以构建。 :) - unwind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接