2013-03-26 8 views
6

devo usare un programma scritto in C che leggere i dati da un file binario in questo modoScrittura dei file binari in python per essere letto da 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; 
     } 

    } 

Il codice di cui sopra non è tutto il codice del programma Sto usando ma solo la parte rilevante per la mia domanda. Ho bisogno di leggere le posizioni delle particelle nCnt, cioè le coordinate per ogni particella. Ho queste posizioni in un array pitone, che assomiglia a questo

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

Come dovrei scrivere questo array in un file binario in modo che il codice C avrebbe letto bene?

+0

Presumibilmente questo è un array di 'numpy'? –

+1

Avete controllato: http://stackoverflow.com/questions/807863/how-to-output-list-of-floats-to-a-binary-file-in-python (la soluzione proposta utilizza http: // docs .python.org/2/library/array.html)? – furins

+0

Non vuoi stringificare i tuoi dati per universalità? Ad esempio è possibile memorizzarlo in JSON, in tal caso non dipenderete da endianness o da bitness. –

risposta

5

Utilizzare il modulo python array ed è tofile() method per scrivere i dati in un formato che può leggere C o IO routines if you use numpy.

Con il numero di cifre, il formato 'f' (float) dovrebbe funzionare.

In C, è possibile leggere ogni riga in questo modo:

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

-1, che non è C. – unwind

+0

@unwind: cosa specificamente non è C? –

+0

Ora è meglio, la strana dichiarazione di 'valori' è stata corretta. Tuttavia, manca un argomento per 'fread()' e gli argomenti che sono presenti sono dati nell'ordine sbagliato. – unwind