我有代碼,使用fstream操作二進制文件與二進制標誌設置和使用未格式化的I/O函數讀取和寫入。這在我使用過的所有系統上都能正常工作(文件中的位與預期完全相同),但這些基本上都是美國英語。我一直想知道這些字節在不同的系統上被codecvt修改的可能性。使用C++編寫二進制文件:默認語言環境很重要嗎?
聽起來像標準所說的,使用無格式I/O的行爲與使用sputc/sgetc將字符放入streambuf中的行爲相同。這些會導致streambuf中的溢出或下溢函數被調用,並且聽起來像這些會導致經歷一些codecvt(例如,參見C++標準中的27.8.1.4.3)。對於basic_filebuf,這個codecvt的創建在27.8.1.1.5中指定。這使得它看起來像結果將取決於basic_filebuf.getloc()返回的內容。
所以,我的問題是,我可以假設在一個系統上使用ofstream.write寫出的字符數組可以在另一個系統上使用ifstream.read逐字恢復,無論任何人可能使用哪種語言環境配置系統?我會做如下假設:
- 程序正在使用默認 區域(即程序不 更改區域設置本身 在所有)。
- 系統都有CHAR_BIT 8,在每個字節內具有相同的位順序,將文件存儲爲八位位組等。
- 流對象具有設置的二進制標誌。
- 在這個階段,我們不需要擔心任何永久性差異。如果數組中的任何字節將被解釋爲多字節值,則將在稍後的階段根據需要處理字節順序轉換。
如果默認語言環境不能保證在某些系統配置(我不知道,阿拉伯語或其他)上未經修改就通過這個東西,那麼使用C++編寫二進制文件的最佳方式是什麼?
我認爲你應該添加相同的字節順序到你的假設。還是我完全在那裏? – 2009-12-02 08:20:19
@TheScottMachine:Space_C0wb0y是正確的,將相同的字節順序添加到您的假設 – Stan 2009-12-02 23:51:19
謝謝,我添加了一個額外的假設來澄清。 – TheScottMachine 2009-12-03 02:22:49