2012-08-25 47 views
1

我有一個名爲TOWRITE的結構。我想將結構的內容寫入文件中。但有一點是結構成員的大小是不固定的。它取決於從另一個來源收到的數據。是否可以通過簡單的方式編寫結構?請參閱下面的代碼片段。C/C++中的不固定結構

感謝

typedef struct TOWRITE 
{ 
    DWORD dwHeader; 
    WORD datacount; 
    LPBYTE lpData; 
    WORD checksum; 
} 

TOWRITE towrite; 
ZeroMemory(&towrite, sizeof(TOWRITE)); 
towrite.lpData = (LPBYTE) new BYTE[256]; 

towrite.dwHeader = 0xF1F1E1E1; 
towrite.datacount = 256; 
towrite.cheksum = 3849; 
CopyMemory(towrite.lpData, szTemp, 256); 

..... 

..... 

..... 

f.write((LPBYTE)&towrite, sizeof(TOWRITE)); 
.... 
.... 
.... 
.... 
+2

不,你只是寫指針到您的數據,這是不是很實用。您還必須寫入'lpData'指向的數據。沒有捷徑。 –

回答

0

只是我修改了代碼,

typedef struct TOWRITE 
{ 
DWORD dwHeader; 
WORD datacount; 
} 

TOWRITE towrite; 
LPBYTE lpData; 
WORD checksum; 

ZeroMemory(&towrite, sizeof(TOWRITE)); 
lpData = (LPBYTE) new BYTE[256]; 

towrite.dwHeader = 0xF1F1E1E1; 
towrite.datacount = 256; 
cheksum = 3849; 
CopyMemory(lpData, szTemp, 256); 

..... 

..... 

..... 

f.write((LPBYTE)&towrite, sizeof(TOWRITE)); 
f.write((LPBYTE)&lpData, datacount); 
f.write((LPBYTE)&checksum, 2); 
.... 
.... 
.... 
.... 
1

你可以試試第三方物流庫:http://tpl.sourceforge.net/

TPL是序列C數據庫。數據以自然二進制形式存儲。該API很小,並試圖保持「擋路」。與使用XML相比,tpl在C程序中更快更容易使用。 Tpl可以序列化許多C數據類型,包括結構。

+0

感謝您的寶貴答覆,但我不能使用任何外部庫 – Riskhan

+0

在這種情況下,如果您會按成員序列化您的結構成員以避免可能的對齊問題,將會更好... – Tutankhamen

+0

@Tutakhamen謝謝 – Riskhan

1

是否可以通過簡單的方式編寫結構。

我不能使用任何外部庫

然後沒有。庫簡單的方法,無論TPL for C還是優秀的Boost.Serialization for C++。 C和C++沒有內置序列化數據結構的機制。所以如果你不能使用庫,那麼你將不得不自己手動編碼序列化。

+0

謝謝你的解決方案 – Riskhan

1

只使用兩個寫電話:

f.write ((LPBYTE)&towrite, sizeof(TOWRITE)); 
f.write ((LPBYTE)&towrite.lpData, towrite.datacount * sizeof(BYTE)); 

,然後你可以再次閱讀:

TOWRITE towrite; 
f.read ((LPBYTE)&towrite, sizeof(TOWRITE)); 
towrite.lpData = (LPBYTE) new BYTE[towrite.datacount]; 
f.read ((LPBYTE)&towrite.lpData, towrite.datacount * sizeof(BYTE)); 
+0

非常感謝你 – Riskhan

3
typedef struct TOWRITE 
{ 
    DWORD dwHeader; 
    WORD datacount; 
    WORD checksum; 
    LPBYTE lpData; //Put the ptr at the end 
} 

// - sizeof(LPBYTE) avoid the ptr @ to be written 
f.write((LPBYTE)&towrite, sizeof(TOWRITE) - sizeof(LPBYTE)); 

// write the ptr data. 
// sorry I don't know windows C. 
// fix the size of the array element :) 
f.write(towrite.lpData, towrite.datacount * sizeof(????)); 
+0

sizeof(TOWRITE) - sizeof(LPBYTE),這裏LPBYTE的大小 – Riskhan

+0

感謝解決方案,靈感來自您的解決方案,我修改了代碼並使用了3寫方法來寫結構,lpdata和校驗和 – Riskhan

0

使用這種方法可以避免冗餘數據,有時來作爲的結果結構填充。

char* data =malloc(sizeof(towrite)-sizeof(LPBYTE)+var_data); 
CopyMemory(data, towrite.dwHeader, sizeof(DWORD)); 
CopyMemory(data, towrite.datacount, sizeof(WORD)); 
CopyMemory(data, szTemp, datalength); 
CopyMemory(data, towrite.checksum, sizeof(WORD)); 
f.write(data,sizeof(towrite)-sizeof(LPBYTE)+var_data);