2013-10-18 46 views
1

所以我建立了一個鏈表並從文件中讀取數據,完成了一些計算和操作,現在我想把新列表存儲到一個二進制文件中。寫一個鏈表到二進制文件(C)

這裏是我的結構設置:

typedef struct Comp{ 
    char name[5]; 
    char node1[5], node2[5]; 
    float value; //value 
}ComponentType; 

typedef struct ListNodeT{ 

    ComponentType Component; 
    float voltage, power, current; 
    struct ListNodeT *nextPtr; 
}ListNodeType; 

在一個單獨的功能,我試圖寫AA文件:

FILE *filePtr; 

char fileName[13] = "SaveData.bin"; 
filePtr = fopen(fileName, "wb"); 
int index = 0; 

while (CircuitData != NULL) 
{ 
    fwrite(CircuitData, sizeof(ListNodeType), 1, filePtr); 
    CircuitData = CircuitData->nextPtr; 
    index++; 
} 

上面的代碼不工作,所以現在我的問題是,能我使用單個fwrite(CircuitData,sizeof(ListNodeType),1,filePtr)寫入文件,或者我應該按如下方式單獨編寫每個組件:

fwrite(CircuitData->Component.name, sizeof(CircuitData->Component.name), 1, filePtr); 

我應該怎麼做?我的第二個問題是,如何將這個二進制文件再次讀回Struct中?

+0

打開文件後是否檢查過'filePtr'的值?可能是它的'NULL'。 –

+0

嗯,我可以打開二進制文件,看到寫了一些東西。 – Ace

+0

「不工作」是什麼意思? (段錯誤,奇怪的值,意外的結果)? –

回答

3

那麼,您將無法在程序的新調用中使用來自文件的指針值,因此您需要對此做些什麼。您可以在打印之前製作副本並清零指針;那麼在閱讀時,您需要爲新分配的結構分配正確的指針值。

我可能會閱讀它們的遞歸函數。事情是這樣的:

ListNodeType *read_list_from_file (FILE *fileptr) { 
    ListNodeType node; 
    ListNodeType *nodeptr; 
    if (fread(&node, sizeof(node), 1, fileptr) == sizeof(node)) { 
     nodeptr = malloc(sizeof(node)); 
     //TODO: handle malloc failure 
     memcpy(nodeptr, &node, sizeof(node); 
     nodeptr->nextPtr = read_list_from_file(fileptr); 
     return nodeptr; 
    } else { 
     return NULL; 
    } 
} 
+0

之間有一個分隔符但寫入部分能否正常工作? – Ace

+0

當然,爲什麼不呢?你的char數組和浮點數都可以。只是指針值是沒有意義的,因爲它們指向另一個不存在或不可訪問的進程中的存儲。 –

+1

執行二進制對象的簡單寫入操作時,也可能存在跨平臺可移植性問題。但爲了在一臺機器上保存/加載,應該沒問題。 –

1

,如果你打算傳送文件,並允許它通過另一臺計算機讀取,你可能有字節表示問題指標(如浮點值)。一種方法是,將浮點數轉換爲write()上的字符串表示形式,並將其轉換回read()。

更好的辦法是使用定義良好的格式(如CSV或XML)