2011-08-06 23 views
1

我想讀的混合數據轉換成C結構讀取混合數據轉換成C結構

通常情況下,我不喜歡這樣

typedef struct data { 
    uint32_t value; 
    float x,y,z; 
} __attribute__((__packed__)); 

,讀它,像這樣:

data x; 
fread(&x, 1, sizeof(data), filePointer); 

而且工作得很好的固定長度的數據,但是,我需要加載一個ASCIIZ字符串,它的長度是可變的,我想知道是否有是讀取到一個結構一個簡單的方法

+1

在最常用的系統,'__attribute __((__ __包裝))'會做什麼在這裏,因爲'uint32_t'和'float'往往既是4個字節。 –

回答

1

有兩種方法,你可以存儲結構的ASCIIZ串,例舉:

struct asciiz_1 
{ 
    char asciiz[32]; 
}; 
struct asciiz_2 
{ 
    size_t buflen; 
    char *buffer; 
}; 

第(struct asciiz_1)可以同樣的方式對待作爲struct data;即使串可以是空(零)字節後垃圾可變長度的,該結構作爲一個整體是一個固定的大小,並且可以與fread()fwrite()安全處理。

第二(struct asciiz_2)是一個丟失的原因。您必須分配額外的空間來接收字符串(大概在讀取長度後),並且不應該將指針值寫入文件(它對讀取過程沒有任何意義)。所以,你必須以不同的方式處理。

你的數據結構 - 你的選擇。

+0

如果使用C99(或者願意做一些可怕的事情),總是會有'struct ascizz_3 {size_t buflen;字符緩衝區[]; };'GCC甚至可以讓你用靈活的數組成員靜態初始化'struct'。 –