2012-04-14 11 views
0

私はPythonで拡張したCコードをいくつか持っています。拡張Cコードには、バイナリファイルに構造体を追加する関数があります。PythonとCファイルを同時に読み書きする

void writefunction(const struct struct1* some,const u_char* struct2){ 
    f=fopen('save.bin',"ab"); 
    if(f==NULL){ 
     printf("Unable to open file"); 
     exit(-1); 
    } 
    fwrite(some,sizeof(struct struct1),1,f); 
    fwrite(struct2,sizeof(u_char),4,f); 
    fclose(f); 
} 

私はPythonでコードをインポートしました。私はPythonで2つのスレッドを開始したい:1つはこのwritefunction()を実行し、もう1つは同じファイルを読み込む。 write関数はあるスレッドで正しく動作していますが、ファイルから読み込んだPython関数が機能していません。

私は間違っていますか?

+0

は、なぜあなたはこれをやろうとしていますか?あるスレッドから別のスレッドにデータを渡そうとしているだけですか、それともファイルを作成する理由がありますか? – steveha

+2

あなたのPythonコードとは何ですか? –

+0

Pythonコードは、単にファイルを読むためのコードです。私はスレッドでCとPythonの両方の関数を実行したい。これは、c write関数がcによってのみ行えるものを書いているからです。 –

答えて

0

しないでください。

ここでの問題は、「save.bin」ファイルの内容は、あなたが使用しているCコンパイラに依存すること、である - そしておそらくいくつかのコマンドラインで使用すると、コンパイラに渡すパラメータ。

構造 struct1が内部メモリに保持されているどのよう

コンパイラ依存している - 少なくともビットフィールドを使用しました。コンパイラが埋め込みを追加することもあります(下記の例を参照)。内部メモリ構造体をファイルに書き込みます。

あなたは異なる言語で書かれたプログラムとデータを交換したい(そしておそらく異なるサーバー上で実行されている)場合は、いくつかの「ワイヤー」(シリアライズ)プロトコルを使用してそれらを変換する必要があります。

提案:たぶんJSONまたはXMLに行ってください。構造を埋める

例:

#include <stdio.h> 

struct struct1 { 
    char a; 
    long b; 
}; 

int main() { 
    printf("%d %d %d\n", sizeof(char), sizeof(long), sizeof(struct struct1)); 
    return 0; 
} 

一つの可能​​な出力は次のとおりです。

1 8 16 
+0

それは必ずしも真実ではありません。いくつかの種類のC構造体はコンパイラに依存しない方法でレイアウトされますが、構造体がビットフィールドを使用しない限り、それは問題ありません。 –

+0

IMHOのビットフィールドは完全にコンパイラ依存ですが、実装固有のフィールド間のパディングもあります。答えを再構成し、小さなCの例を追加してください。 –

+0

私は個別にcのwrite関数をPythonで拡張することでファイルを作成し、私はpython関数を使ってファイルsave.binを読むことができます。しかし、私はそれを同時に読むcfunctionを書くときにしたい。これを行う方法はありますか? –

関連する問題