簡體   English   中英

將struct寫入文件時,寫入了太多字節

[英]When writing struct to a file too many bytes are written

我正在嘗試編寫一個簡單的TGA圖像文件保護程序,作為C ++中的學習練習。 我將代碼基於示例TGA加載器,該加載器聲明了標頭的結構,然后使用fread()一次性加載了整個標頭。

我的程序目前無法正常工作,似乎有兩個額外的字節正在寫入文件。 我打印了我的結構的大小,它的兩個字節太大(20個字節,而不是正確的18個字節)。 稍作閱讀后,我認為問題與數據對齊和填充有關(我對結構的存儲方式不是很熟悉)。

我的問題是對此有什么好的解決方案? 我想我可以逐字節地編寫該結構的組件,而不是使用fwrite()一次寫入整個結構,這就是我現在要做的。 我假設如果在加載標頭時可以使用,那么在編寫標頭時也可以使用。 我的假設不正確嗎?

允許編譯器經常將填充字節插入結構中,以便字段在適當的存儲器地址上對齊。

最簡單的解決方案是指示編譯器“打包”該結構,這意味着不要插入任何填充字節。 但是,這將使對結構的數據訪問變慢,並且實現該方法的方式取決於編譯器。 如果您想變得可移植且高效,那么唯一的方法就是分別編寫字段。

即使加載它也不起作用。 您有兩種選擇:

  1. 使用編譯器特定的指令(打包#pragma等)將結構強制為18個字節。

  2. 通過使用偏移量和指針來獲取/設置緩沖區字段,從而編寫出更具移植性的代碼。

結構的元素通常排列在4個字節的邊界上。

如果您的結構中有短褲或字符,則該結構大於各個元素大小的總和。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM