2012-04-14 109 views
0

我有一些C代碼,我已經在Python中進行了擴展。擴展的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中啓動兩個線程:一個將運行此writefunction(),另一個將讀取同一個文件。寫函數在一個線程中正常工作,但從文件讀取的Python函數不起作用。

我在做什麼錯?

+0

爲什麼你想這樣做嗎?你只是試圖將數據從一個線程傳遞到另一個線程,還是有你寫文件的原因? – steveha 2012-04-14 04:40:52

+2

什麼是你的Python代碼,什麼不工作? – 2012-04-14 05:08:03

+0

Python代碼只是文件讀取的代碼。我想在線程中運行C和python函數。這是因爲c寫功能正在寫一些只能由c完成的事情。 – 2012-04-14 05:17:27

回答

0

不要這樣做。

這裏的問題是,'save.bin'文件的內容取決於您正在使用的C編譯器 - 也許在您傳遞給編譯器的某些命令行參數上。

結構struct1如何內部保存在內存中與編譯器有關 - 至少在使用位域時;編譯器也可能會添加填充(請參閱下面的示例)。您將內部內存結構寫入文件。

如果你想與用不同語言編寫的程序交換數據(也可能運行在不同的服務器上),你應該使用'wire'(串行化)協議來轉換它們。

提案:可能會使用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結構將以獨立於編譯器的方式進行佈局,但只要結構不使用位域,它應該沒問題。 – 2012-04-14 06:17:20

+0

恕我直言,bitfields完全依賴於編譯器 - 但也是特定實現中不同字段之間的填充。重新編寫答案並添加一個小例子。 – 2012-04-14 06:29:21

+0

當我獨立運行c的寫函數時,通過在python中擴展它,它創建文件,並且我能夠使用我的python函數讀取文件save.bin。但是我想在cfunction寫入時同時讀取它。有沒有辦法做到這一點? – 2012-04-14 07:28:01