2016-09-10 95 views
1

在C中,我試圖選擇結構的特定成員並將其打印出來。我想知道,這種操作的建議格式是什麼?我嘗試了幾乎所有我能想到的。我似乎無法將其限制爲該結構的特定chunk成員。fread fseek只有C中的struct成員

fseek(in, sizeof(d.contents.datas.chunk), SEEK_SET); 
fread(&ch, 1, 1, in); 
fprintf(out, "%02x", (int)(ch & 0x00FF)); 

看來我可以得到所有的結構數據,或只有一個字符。出於某種原因,數據也不是正確的,例如bytes應該是實際的bytes,但它的出現爲1。很顯然,這個結構的數據打印方式有些問題。這可能是大endian vs小endian嗎?我知道我正在訪問的文件是big endian。

的結構林訪問如下:

struct chunkInfo 
{ 
    int chunkInformation; 
    int bytes; 

    union 
    { 
     struct 
     { 
      long size;  
      char chunk[1];  
     } datas;     
    } contents;     
}; 
+1

#pragma pack(忽略endian) –

+0

是的,如果你在一個intel架構上並且接收到big endian的數據,你需要轉換它。查看例如'hton'和'ntoh'。 –

+0

通常,使用像json或xml這樣的ascii格式進行網絡數據傳輸可能是最安全的。如果發送機器使用64位整數,但使用32位呢?等 –

回答

2

您正在尋求在文件中錯誤的地方。假設你的機器的尾數相同文件的字節序,那麼這將工作:

fseek(in, long(&d.content.data.chunk[0] - &d), SEEK_SET); 
fread(&ch, 1, 1, in); 
fprintf(out, "%02x", (int)(ch & 0x00FF)); 

第一行計算在結構塊的字節偏移量。你正在使用的sizeof(塊),當然這只是返回1.

如果endian不同,那麼在讀取結構後,必須將每個非char字符轉換爲正確的endian。

+1

而且''offsetof()''可以從''進行偏移計算。 –

+0

@JonathanLeffler感謝您指出抵消。 –

+0

我一直在嘗試解決這個問題大約1周,因爲我對C有點新,並且你們都爲我解決了這個問題。我把我的帽子給你們,謝謝soooo :) –