我只想建議手動讀取/寫入結構的成員分別。使用您的編譯器指令進行打包可能導致無法訪問的未對齊數據的低效率和可移植性問題。如果你必須處理字節順序,稍後當讀取操作分解爲字段成員而不是整個結構時很容易。
另一件事情,這更多地涉及到未來派的維護類型的關注,是你不希望你的序列化代碼或人們已經保存的文件到目前爲止打破,如果你有點改變結構(添加新的元素或甚至改變順序作爲緩存行優化,例如)。所以你可能會遇到很少的代碼,它比直接將結構的內存內容轉儲到文件中提供更多的呼吸空間,並且通常最終需要努力單獨序列化你的成員。
如果要概括的模式,減少樣板你寫的金額,你可以做這樣的事情作爲一個基本的例子來啓動和建立在:
struct Fields
{
int num;
void* ptrs[max_fields];
int sizes[max_fields];
};
void field_push(struct Fields* fields, void* ptr, int size)
{
assert(fields->num < max_fields);
fields->ptrs[fields->num] = ptr;
fields->sizes[fields->num] = size;
++fields->num;
}
struct Fields s_fields(struct s* inst)
{
struct Fields new_fields;
new_fields.num = 0;
field_push(&new_fields, &inst->i1, sizeof inst->i1);
field_push(&new_fields, &inst->s1, sizeof inst->s1);
field_push(&new_fields, &inst->c1, sizeof inst->c1);
return new_fields;
}
現在你可以使用這個Fields
結構與通用功能來讀取和寫入任何結構的成員,就像這樣:
void write_fields(FILE* file, struct Fields* fields)
{
int j=0;
for (; j < fields->num; ++j)
fwrite(fields->ptrs[j], fields->sizes[j], 1, file);
}
這通常是一個容易一點比一些功能for_each_field
種方法接受一個回調的工作。
現在你不用擔心,當你創造出一些新的結構,S
約,是從一個實例定義一個函數來輸出struct Fields
到,然後讓所有你寫與struct Fields
工作,現在這方面的工作的一般功能新的S
自動鍵入。
查看接受的答案http://stackoverflow.com/questions/4306186/structure-padding-and-structure-packing – rslemos
這是編譯器特定的。你正在使用哪種編譯器? –
您可以遍歷數組,並分別寫入結構的每個元素。 – ace