2014-09-20 56 views
0

回想一下在大學畢業後的幾年時間裏,用C++進行遊戲時,在查找如何以C++字節讀取文件時,我遇到的一些信息是,沒有任何神奇的「readAsbytes」函數,你本質上應該通過讀取文件來完成這一點,就像文本文件一樣,但是確保存儲結果爲char*。例如:以字節讀取文件並將其存儲到一個確定性的8位值數組中

someIFStream.read(someCharPointer, sizeOfSomeCharPointer); 

話雖這麼說,即使在chars C++通常被認爲是對周圍8位,這是不完全保障。開始討論不同的平臺和文本編碼足夠長的時間,如果你想要一個真正的字節數組,你會遇到問題。

您可以使用uint8_t*並從char*複製所有內容。 。 。但是,這太浪費了。爲什麼我們不能在第一時間把所有東西都寫入uint8_t*,而我們仍然在讀取文件,而不必擔心它是32位機器還是64位機器,或者UTF-8或UTF-16或你有什麼?

所以問題是:這是可能的,至少在更現代的C++版本?如果是這樣,怎麼樣?我不想從char*變爲uint8_t*的原因基本上是不需要浪費一些CPU週期在一些50,000迭代for循環上。謝謝!

編輯

我定義一個字節爲這一問題的目的,8位,除非有人強烈暗示,否則。我的理解是,字節最初是6位,然後變成7,然後最終定位在8位,但是32位組合等通常被認爲是小字節集合。如果我錯了,或者我應該以不同的方式思考這個問題(無論哪種方式),請將它提出來。

+0

可能重複[字符保證是正好8位長?](http://stackoverflow.com/questions/881894/is-char-guaranteed-to-be-exactly-8-bit-long) – jww 2014-09-20 02:34:10

+0

@jww不,我已經看到了這個問題及其被接受的答案,基本上說他們偶爾會更長。既然這意味着你不能真正依靠'chars'來獲得8位,你必須找到另一種數據類型。這是導致我問這個問題的一部分。 – Panzercrisis 2014-09-20 02:37:25

+0

「開始討論不同的平臺和文本編碼足夠長的時間,如果你想要一個真正的字節數組,你將遇到問題。」在什麼平臺的C + +類型char不是8位? – thang 2014-09-20 02:58:46

回答

2

A char是一個字節,文件是字節序列。無論機器是32位還是64位或其他,無關緊要,文本是以UTF-8還是UTF-16或其他格式存儲都無關緊要。一個文件包含字節,每個字節適合於char。這是標準要求的。

可以改變的是特定平臺上的字節中有多少位。如果是8,則charuint8_t(除了簽名之外,不影響數據存儲方式)相同,您可以直接將字節讀入uint8_t。但是如果一個字節是10位,那麼你必須將所有這些chars都放在一個循環中,因爲從文件中讀取給出了一個10位字節的序列,並且您需要從每個字節中截掉兩位一。

如果你希望你的程序是adaptible不同的字節大小,您可以使用#if CHAR_BIT == 8來決定是否讀直入uint8_t陣列或者讀入到char數組,然後所有字節投進去之後uint8_t


既然你從文件中讀取原始數據char當「回來C++」,並擔心UTF-8對UTF-16,我猜你習慣於像Java和語言C#,其中char類型表示一個Unicode字符。在C和C++中情況並非如此。A char是一個字節,如果您從文件中讀取多字節UTF-8字符,則會將每個單獨的字節作爲單獨的char而不是整個Unicode字符作爲單個值。

+0

謝謝!現在,我想我只會堅持'char'指針。 – Panzercrisis 2014-09-20 02:56:55

+0

請注意,'uint8_t'和好友是可選的,只有在實現提供了具有這些大小的整數類型時才需要提供。在CHAR_BIT不是8的系統中,uint8_t很可能不存在,因此投射到它不是一個選項。 – 2014-09-20 02:59:00

+0

@PaulGriffiths,'uint8_t'似乎很愚蠢,只存在於冗餘的平臺上...... – Wyzard 2014-09-20 03:09:00

相關問題