2010-08-08 22 views
0

我目前正在嘗試用C++編寫一個.bmp文件,而且大多數情況下它的工作原理都是一樣的,但只有一個問題。當我開始嘗試保存具有不同寬度和高度的圖像時,一切都會發生歪斜,我正在努力解決它,所以有什麼辦法強制某些東西寫入特定的字節(在它和最後寫入的東西之間添加填充) ?寫入二進制文件C++,強制某些東西在字節18?

+1

我不明白,什麼阻止您在寫入數據之前或之後編寫填充字節? – NullUserException 2010-08-08 16:07:34

+0

說實話,我也沒有。但是當我改變它的價值時,它似乎跳回了一個字節,並且在它之前已經有填充來阻止它這樣做。 – Elephantinc 2010-08-08 16:36:20

+0

聽起來像你用來寫出來的代碼是錯誤的。你不需要爲此使用fseek()。 – Kylotan 2010-08-08 17:44:23

回答

1

有幾種明顯的答案,比如將數據保存在緩衝區的內存中,然後將所需值填入bufr[offset]=mydata;。我認爲你需要一些比這更有趣的東西,例如,你在一個流式應用程序中這樣做,你不能同時在內存中存儲整個對象。

在這種情況下,你要找什麼是FSEEK(3)FTELL(3)(見man pages)提供的魔力。尋找文件的位置作爲特定的偏移量;告訴獲取文件的當前偏移量。如果它是一個常數18的偏移量,你只需完成了該文件,並做

fseek(fp, 18L, SEEK_CUR) 

其中fp是文件指針,SEEK_CURstdio.h聲明的常數,18是多少18

更新

順便說一句,這是基於系統調用lseek的(2)。讓人困惑的東西(讀「我」,直到我搜索時纔會記得這一點)是沒有匹配的「ltell(2)」系統調用。相反,爲了得到當前文件偏移,使用

off_t offset; 
offset = lseek(fp, 0L, SEEK_CUR); 

因爲lseek的返回其操作之後的偏移。上面的示例代碼爲我們提供了從當前偏移量移出0個字節後的偏移量,當然這也是當前的偏移量。

更新

AHA,C++。你說過C對於C++來說,有成員函數用於查找和告訴。請參閱fstream man page.

+0

謝謝:) 看起來應該這樣做。 – Elephantinc 2010-08-08 17:00:17

+0

我打開這樣的文件: ofstream out(「test.bmp」,ios :: out | ios :: binary); 那麼我該如何放置廣告文件指針? – Elephantinc 2010-08-08 18:05:52

1

計算寫入的字節數。寫入零直到計數達到18,然後繼續寫入您的真實數據。

0

如果你在Windows上,一切都來編寫預定義的結構:"Bitmap storage"

此外還有一個示例,顯示它們應如何填充:"Storing an Image"

如果你正在編寫不只是爲了Windows代碼,那麼你可以模仿這些結構和休閒指南。