我目前正在嘗試用C++編寫一個.bmp文件,而且大多數情況下它的工作原理都是一樣的,但只有一個問題。當我開始嘗試保存具有不同寬度和高度的圖像時,一切都會發生歪斜,我正在努力解決它,所以有什麼辦法強制某些東西寫入特定的字節(在它和最後寫入的東西之間添加填充) ?寫入二進制文件C++,強制某些東西在字節18?
回答
有幾種明顯的答案,比如將數據保存在緩衝區的內存中,然後將所需值填入bufr[offset]=mydata;
。我認爲你需要一些比這更有趣的東西,例如,你在一個流式應用程序中這樣做,你不能同時在內存中存儲整個對象。
在這種情況下,你要找什麼是FSEEK(3)和FTELL(3)(見man pages)提供的魔力。尋找文件的位置作爲特定的偏移量;告訴獲取文件的當前偏移量。如果它是一個常數18的偏移量,你只需完成了該文件,並做
fseek(fp, 18L, SEEK_CUR)
其中fp
是文件指針,SEEK_CUR
是stdio.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.
謝謝:) 看起來應該這樣做。 – Elephantinc 2010-08-08 17:00:17
我打開這樣的文件: ofstream out(「test.bmp」,ios :: out | ios :: binary); 那麼我該如何放置廣告文件指針? – Elephantinc 2010-08-08 18:05:52
計算寫入的字節數。寫入零直到計數達到18,然後繼續寫入您的真實數據。
如果你在Windows上,一切都來編寫預定義的結構:"Bitmap storage"。
此外還有一個示例,顯示它們應如何填充:"Storing an Image"。
如果你正在編寫不只是爲了Windows代碼,那麼你可以模仿這些結構和休閒指南。
- 1. 在C中的二進制文件中寫入字節0
- 2. 寫入二進制文件在C++
- 3. C中有效的文件保存,將某些位寫入二進制文件
- 4. 寫入二進制文件?
- 5. 寫入二進制文件
- 6. 寫入二進制文件
- 7. 寫入二進制文件
- 8. 將0寫入二進制文件C++
- 9. C++二進制文件寫入
- 10. 使用C寫入二進制文件#
- 11. 使用二進制寫入空字節
- 12. 將字節[]寫入二進制文件的最佳方法
- 13. 以二進制或字節碼寫入文件
- 14. Sass - 強制sass引擎不格式化某些東西
- 15. 在Ruby中寫入二進制文件
- 16. 在TideSDK中寫入二進制文件
- 17. 在Xcode中寫入二進制文件
- 18. 在Java中寫入二進制文件
- 19. 在PROLOG中寫入二進制文件
- 20. 在Julia中寫入二進制文件
- 21. 在R中寫入二進制文件
- 22. Python - 將一個雙字節字符串作爲單字節十六進制字符寫入二進制文件
- 23. Bash:在二進制文件中替換一些字節
- 24. 寫入無符號字符向量到二進制文件C++
- 25. 字符串寫入到二進制文件用C
- 26. 將字符串寫入二進制文件C++
- 27. 在C++和C中寫入二進制文件#
- 28. C - 僅使用3個字節將整數寫入二進制文件
- 29. 寫的字符串二進制數據的二進制文件
- 30. 複製一個二進制文件32字節每32字節
我不明白,什麼阻止您在寫入數據之前或之後編寫填充字節? – NullUserException 2010-08-08 16:07:34
說實話,我也沒有。但是當我改變它的價值時,它似乎跳回了一個字節,並且在它之前已經有填充來阻止它這樣做。 – Elephantinc 2010-08-08 16:36:20
聽起來像你用來寫出來的代碼是錯誤的。你不需要爲此使用fseek()。 – Kylotan 2010-08-08 17:44:23